Существует ли простой способ узнать количество страниц?

Автор Rafik, 6 апреля 2016, 14:24

0 Пользователи и 1 гость просматривают эту тему.

Rafik

Не могу найти простой и безотказный способ получения количества страниц.
Пришлось сделать такой макрос:Function GetEndAdr(oSheet As object)
' oSheet - Ссылка на лист
oCursor = oSheet.createCursor
oCursor.GotoEndOfUsedArea(false)
nEndRow = oCursor.RangeAddress.EndRow
nEndCol = oCursor.RangeAddress.EndColumn
GetEndAdr = Array(nEndCol,nEndRow) ' Возвращаем адрес последней ячейки документа
end Function

Function Pages1(Optional oDoc As object) As Long
' Считает количество страниц в активном листе.
If isMissing(oDoc) Then
oDoc = ThisComponent
End if
oSheet = oDoc.CurrentController.getActiveSheet()
' Получаем расположение разрывов страницы по колонкам и строкам
oColPgBr = oSheet.getColumnPageBreaks()
oRowPgBr = oSheet.getRowPageBreaks()
' Адрес последней ячейки
oEndAdr = GetEndAdr(oSheet)
'--- Сколько каких разрывов страниц попадает в диапазон (0,0,последн_колонка,последн_строка)
nVert = 0 ' Вертикальные
nHor = 0 ' Горизонтальные
ii = 0
' Позиция первого разрыва. Приводим номер колонки к индексу
nPos1 = oColPgBr(ii).Position - 1
' Сколько вертикальных вписывается ВНУТРЬ диапазона
Do While nPos1 < oEndAdr(0)
nVert = nVert + 1
ii = ii + 1
nPos1 = oColPgBr(ii).Position - 1
Loop
ii = 0
' Позиция первого разрыва. Приводим номер строки к индексу
nPos1 = oRowPgBr(ii).Position - 1
' Сколько горизонтальных вписывается ВНУТРЬ диапазона
Do While nPos1 < oEndAdr(1)
nHor = nHor + 1
ii = ii + 1
nPos1 = oRowPgBr(ii).Position - 1
Loop 
'--- Подсчитали, теперь высчитаем количество страниц
If nVert= 0 And nHor = 0 Then
' Если нет ВНУТРИ разрывов - одна страница
Pages1 = 1
ElseIf nVert > 0 And nHor = 0 Then
' Только вертикальные
Pages1 = nVert + 1
ElseIf nVert = 0 And nHor > 0 Then
' Только горизонтальные
Pages1 = nHor + 1
ElseIf nVert > 0 And nHor > 0 Then
' есть и те и другие
Pages1 = (nHor+1)*(nVert + 1)
End If
End Function


rami

Простой способ узнать количество страниц — посмотреть в свойствах документа статистику, но если нужно рассчитать, то проще всего так:
Function nPages
oSheet=ThisComponent.CurrentController.ActiveSheet
oColPgBr=oSheet.ColumnPageBreaks
oRowPgBr=oSheet.RowPageBreaks
nPages=(UBound(oColPgBr)+1)*(UBound(oRowPgBr)+1)
End Function

Rafik

#2
rami, в версии 4.2.2 показывает умопомрачительное количество страниц = 1805688, хотя в диапазоне печати всего лишь 2 страницы. Я начал писать свой макрос ласипед именно с такой краткой процедуры.

За формулу пересчета на листы огромное спасибо. Цепочку "если" можно будет заменить формулой. Вот что получилось в итогеFunction Pages1(Optional oDoc As object) As Long
' Считает количество страниц в активном листе.
If isMissing(oDoc) Then
oDoc = ThisComponent
End if
oSheet = oDoc.CurrentController.getActiveSheet()
' Получаем расположение разрывов страницы по колонкам и строкам
oColPgBr = oSheet.getColumnPageBreaks()
oRowPgBr = oSheet.getRowPageBreaks()
' Адрес последней ячейки
oEndAdr = GetEndAdr(oSheet)
'--- Сколько каких разрывов страниц попадает в диапазон (0,0,последн_колонка,последн_строка)
nVert = 0 ' Вертикальные
nHor = 0 ' Горизонтальные
' Сколько вертикальных вписывается ВНУТРЬ диапазона
Do While oColPgBr(nVert).Position - 1 < oEndAdr(0)
nVert = nVert + 1
Loop
' Сколько горизонтальных вписывается ВНУТРЬ диапазона
Do While oRowPgBr(nHor).Position - 1 < oEndAdr(1)
nHor = nHor + 1
Loop  
'--- Подсчитали, теперь высчитаем количество страниц и вернем его
Pages1 = (nHor+1)*(nVert + 1)
End Function


В моем ласипеде есть неточность. Если конец документа <> концу диапазона печати, будет неправильное количество страниц. Поэтому надо будет в GetEndAdr определять координаты последней ячейки для PrintArea, а не для листа.

rami

Цитата: Rafik от  7 апреля 2016, 05:27в версии 4.2.2 показывает умопомрачительное количество страниц = 1805688, хотя в диапазоне печати всего лишь 2 страницы.
В разных условиях результат получается разный, а для чего это нужно? Может быть зная более подробные условия и для каких целей нужно количество печатных листов, удасться "подогнать" решение.

В свойствах документа эти данные есть и для свойств они вычисляются правильно, но при попытке доступа через макрос они выдают "0" (ноль), кажется разработчики что-то не "привинтили".

Rafik

Ежемесячно некая программа рожает отчеты в формате *.xls и некоторые документы (обычно 4-8) надо напечатать не полностью, а только первый и последний (или предпоследний+последний) лист. Лень открывать каждый из этих документов, переключаться в режим разметки, идти в хвост, смотреть что попадает на последнюю страницу, руками запускать печать.
Можно с помощью макросов выловить эти отчеты по названию файла из папки с отчетами. Можно определить сколько страниц. Можно определить, по содержимому первой строки на последней странице, что на последней странице: только подписи или попала часть таблицы со сведениями. Исходя из содержимого первой строки последней страницы можно решить какие листы печатать: только последний или предпоследний+последний.
Черновой вариант такого ласипеда уже сделал.