Range и области печати

Программирование на Visual Basic for Applications
Sedge
Alternative Choice
Alternative Choice
Аватара пользователя
 
Сообщения: 1049
Зарегистрирован: 16.05.2002 (Чт) 18:23
Откуда: Somewhere-In-The-Net

Range и области печати

Сообщение Sedge » 26.11.2004 (Пт) 14:10

Дано: лист MS Excel 2000, на котором выделена области печати, разбитая на некоторое количество страниц. Как определить, к какой странице принадлежит произвольная ячейка этого же листа?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 26.11.2004 (Пт) 14:15

Интересный вопрос :)
Я бы поискал в направлении VPageBreaks/HPageBreaks (предварительно выполнив Preview), но помоему в Excel нет нормальных средств, чтобы определить, на какой странице будет напечатана та или иная ячейка.
Lasciate ogni speranza, voi ch'entrate.

Sedge
Alternative Choice
Alternative Choice
Аватара пользователя
 
Сообщения: 1049
Зарегистрирован: 16.05.2002 (Чт) 18:23
Откуда: Somewhere-In-The-Net

Сообщение Sedge » 26.11.2004 (Пт) 14:35

А интересная мысль... Собственно, по индексу HPageBreak мы можем определить номер страницы, которая с него начинается. Пойду думать.

Sedge
Alternative Choice
Alternative Choice
Аватара пользователя
 
Сообщения: 1049
Зарегистрирован: 16.05.2002 (Чт) 18:23
Откуда: Somewhere-In-The-Net

Сообщение Sedge » 01.12.2004 (Ср) 21:28

Если кому интересно.
Задача была в том, чтобы определить, укладывается ли таблица при печати в одну страницу. По ряду причин известно, что данная таблица по горизонтальным и вертикальным размерам никогда не привышает печатного листа формата А4.
Решение: начало и конец таблицы отмечается именованным диапазоном. Далее - функция:
Код: Выделить всё
Private Function IsRangeInPage(sRangeOne As String, sRangeTwo As String, ws As Object) As Boolean
'
On Error GoTo eRes

'//////////////////////////////////////////////////////////////////////////////////////
  Dim j As Long
  Dim bIsSame As Boolean, lRangeOneRow As Long, lRangeTwoRow As Long
  Dim lPageBreakRow As Long
  Dim lPagePrevBreakRow As Long
'//////////////////////////////////////////////////////////////////////////////////////

If ws.HPageBreaks.Count = 0 Then
  IsRangeInPage = True
  Exit Function
End If

lRangeOneRow = ws.Range(sRangeOne).Row
lRangeTwoRow = ws.Range(sRangeTwo).Row

lPageBreakRow = ws.HPageBreaks(1).Location.Row
If lRangeOneRow < lPageBreakRow And lRangeTwoRow < lPageBreakRow Then
  IsRangeInPage = True
  Exit Function
End If

bIsSame = False
For j = 2 To ws.HPageBreaks.Count
  lPageBreakRow = ws.HPageBreaks(j).Location.Row
  lPagePrevBreakRow = ws.HPageBreaks(j - 1).Location.Row
  If lRangeOneRow < lPageBreakRow And _
    lRangeTwoRow < lPageBreakRow And _
    lRangeOneRow > lPagePrevBreakRow And _
    lRangeTwoRow > lPagePrevBreakRow Then
      bIsSame = True
      Exit For
  End If
Next

IsRangeInPage = bIsSame
Exit Function
eRes:
  Call Err.Raise(Err.Number, "IsRangeInPage", Err.Description)
End Function


Если IsRangeInPage возвращает False, то перед именованным диапазоном-началом таблицы добавляем разрыв страницы:
Код: Выделить всё
  HPageBreaks.Add Before:=.Range(<имя диапазона>)


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 69

    TopList