Страницы: 1
RSS
PageSetup
 
Всем привет,  
 
Формирование страниц в Excel производится в зависимости от масштаба, размера полей и формата бумаги.    
Задача: Написать алгоритм разбиения страниц, таким образом, чтобы на последней странице было не менее к примеру 6 строк (строка с итогом и подписи).  
 
Вопрос: Как расчитать разбиение страниц?  
 
Прошу извинить за сумбур. Просто понятия не имею с чего начать.  
 
Заранее благодарен.  
 
Владимир.
 
имеем таблицу с 30-ю строками.  
Устанавливаем разрыв для последней страницы.  
Sheets("???").HPageBreaks.Add Before:=ActiveCell  
Вместо ActiveCell вонзить Cells(24,1).  
Не проверял.
 
Определим максимум строк, которые будут отображаться на странице при печати.  
Допустим N  
Определим допустимое количество строк на последней странице M (в нашем случае 6)  
Пусть в таблице всего K строк.  
 
Нам нужно сделать    
K = N*x + r  
где r>=M (остаточное количество строк)  
а x - это количество раз, когда мы напечатаем N строк. Целое число.  
В остатке должно остаться r строчек.  
 
Нужно вставить x разрывов через каждые N строк  
Activesheet.HPageBreaks.Add Before:=ActiveCell  
 
Для примера рассмотрим таблицу, в которой 132 строки. Выводим 20 страниц на печать и должно на последней быть не менее 6.  
Соответственно  
132 = 20*x-6  
20x=126  
x=округлвниз[126/20]
x=6  
Таким образом, 6 раз влезет 20 страниц и останется 12 для последней страницы.  
 
Если 123 строки в таблице, то  
123 = 20х-6  
20х=117  
x=5
 
Конечно, ошибся  
132 = 20*x-6  - > 132 = 20*x+6  
123 = 20х-6   - > 123 = 20х+6    
 
По самой процедуре расстановки PageBreak-ов: можно организовать цикл, в котором проверять сколько осталось строк от Activecell до конца таблицы. Как только осталось меньше, чем нужно - выходить из цикла.
 
Спасибо НО, не то... Задам вопрос по другому:  
 
Что известно:    
1. Количество строк на листе, к примеру n.  
2. Zoom листа, к примеру 90%.  
3. Отступ с верху и отступ снизу печатного листа, к примеру 1 см.  
4. Размер листа, к примеру A4.  
5. Ориентация листа, к примеру Landscape.  
 
Надо определить:        
 
1. Сколько строк поместится на печатном листе?  
2. Сколько сантиметров на печатном листе занимает одна строка?  
 
Остальное дело техники...
 
Можно попробовать такой вариант:  
Переходим в Вид -> Страничный режим  
ActiveWindow.View = xlPageBreakPreview  
 
Смотрим на коллекцию  
ActiveSheet.HPageBreaks  
 
Определяем номер строки, где стоит разрыв:  
ActiveSheet.HPageBreaks(1).Location.Row  
 
Например, это строка 33.  
В зависимости от формата бумаги, ориентации листа и полей (отступов от краев) понимаем сколько см у нас приходится на зону печати. Дальше делим на количество строк.
 
ActiveSheet.HPageBreaks(ActiveSheet.HPageBreaks.Count).Location.Row мне понравилась. Спасибо.  
Теперь я знаю сколько строк на последней странице. Осталось посчитать величину корректирующего нижнего отступа.
 
Получился простенький макрос который позволяет не разбивать область подписей листа переменной длины при печати.    
 
Sub t()  
 Dim LastRow As Long, t As Long, n As Double  
 With ThisWorkbook.Sheets(1)  
   LastRow = .Cells(.Rows.Count, 1).End(xlUp).Row  
   ActiveWindow.View = xlPageBreakPreview  
   t = .HPageBreaks(.HPageBreaks.Count).Location.Row  
   Do While t + 6 > LastRow  
    n = n + 0.1  
    .PageSetup.BottomMargin = Application.CentimetersToPoints(n)  
    t = .HPageBreaks(.HPageBreaks.Count).Location.Row  
   Loop  
 End With  
  ActiveWindow.View = xlNormalView  
End Sub  
 
Еще раз Спасибо Бонд.
 
Пожалуйста. ;)  
Хотя я только указал направление мысли.
Страницы: 1
Наверх