Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.02.2015, 16:52   #1
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию Переформатирование листа для печати на нескольких страницах.

Мне бы просто словесное описание, что надо делать, а то не могу понять, как приступиться.

В общем есть изначальный лист с шапкой, основной таблицей и подвалом.

Этот исходный лист надо подготовить для печати, т.е. разбить на несколько страниц. На каждой их них шапка и подвал остаются неизменными, меняется лишь содержание таблицы. Все бы ничего, но высота строки таблицы не статична, а подгоняется под содержание. Гарантируется лишь одно - в рабочую таблицу на каждом листе влезает как минимум одна строка и строка не может быть выше отведенного места под таблицу с данными.

Высоты строчек я подсчитал. А что дальше - смутно, смутно...
Smogg вне форума Ответить с цитированием
Старый 16.02.2015, 17:15   #2
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

Шапка: параметры страницы - лист - сквозные строки. Или верхний колонтитул.
Подвал: создайте нижний колонтитул.
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 16.02.2015, 17:21   #3
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

т.е. можно назначить строки в листе как подвал и шапку соответственно?

Мне это дело надо в макросе обработать. Чтоб ячейка не разрывалась на середине, а переносилась на следующий лист, если не влазит. И подсчитать количество получившихся печатных страниц.

Последний раз редактировалось Smogg; 16.02.2015 в 17:32.
Smogg вне форума Ответить с цитированием
Старый 16.02.2015, 18:59   #4
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

Сквозные строки как шапку - можно, как подвал - нет, поэтому я и предлагаю подвал сделать колонтитулом.
Программа позаботится о том, чтобы ячейки не разрывались.
Число страниц
Код:
(mysheet.hpagebreaks.count+1)*(mysheet.vpagebreaks.count+1)
, перед обращениям к этим свойствам желательно вызвать предпросмотр печати.
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 19.02.2015, 16:56   #5
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

Цитата:
Сообщение от Казанский Посмотреть сообщение
перед обращениям к этим свойствам желательно вызвать предпросмотр печати.
Подскажите еще:
Логика макроса такая - из данных создается книга из нескольких листов.
По завершению работы эти листы открываются в режиме предпросмотра. Получается документ по ссылке - http://rghost.ru/8PpxpWrBS

Шапка, как договорились, будет копироваться на каждую страницу. Устанавливается как сквозные строки.

Тот блок, который про реквизиты руководителя и бухгалтера желательно печатать в самом конце один раз, но без разрывов, т.е. на одной странице. А если на одной странице, то мне кажется, что надо бы хотя бы одну строчку из данных перенести на последнюю страницу. Т.е. разрыв страницы будет на строке "Услуги редактирования".

Т.е. как мне узнать, когда надо принудительно ставить разрыв страницы на предпоследней строчке таблицы, а когда нет, ибо реквизиты руководителей и так умещаются? Надо открыть в предпросмотре, закрыть, определить, где получились разрывы страниц, и в зависимости от результата поставить или нет свой ручной разрыв?

И надо, чтоб в конце открылся итоговый документ в предпросмотре.

Сейчас предпросмотр открывается так:
Код:
wbNew.PrintOut Copies:=1, Collate:=True, Preview:=True
Но это PrintOut, а не ShowPrintPreview какой-нибудь...

Ps: Вижу лишь решение костылем - подсчитать вручную сколько по высоте места остается для таблицы на одной странице, и если получившаяся таблица не состыкуется с этой константой, то соответственно вставлять разрыв. Но это костыль, константа зависит как минимум от высоты шрифта, а конкретнее - высоты строк в шаблоне бланка...

Зыы: с превью разобрался)

Цитата:
This code will show the print preview
Код:
ActiveWindow.SelectedSheets.PrintPreview
This code will close print preview

Код:
Application.SendKeys "{ESC}" 
' ESCAPE 

- *** OR *** 

Application.SendKeys "%{F4}"
Зыыыы: А вот и фиг... У меня макрос управляется из окна диалога, и соответственно, Esc уходит в это окно диалога, а не в основное окно, где по идее должен открываться превью (может и не открывается, не увидел, виснет).
Поэтому лишь костыль через константу ((

Последний раз редактировалось Smogg; 19.02.2015 в 18:01.
Smogg вне форума Ответить с цитированием
Старый 19.02.2015, 18:32   #6
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Цитата:
как мне узнать, когда надо принудительно ставить разрыв страницы
пройдитесь по коллекции hPageBreakes листа
у каждого элемента есть
.Location.Row

если ОБЯЗАТЕЛЬНО нужно напечатать на одной странице допустим строки c 85 по 93
а один из Location.Row оказался в этом интервале, допустим = 90
это значит, что часть строк будет на одной странице, а часть на след.

вставте принудительный разрыв страницы перед 85 строкой и готово
ActiveSheet.HPageBreaks.Add Before:=Cells(85,1)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 19.02.2015, 19:45   #7
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

Спасибо)
Цитата:
Сообщение от IgorGO Посмотреть сообщение
пройдитесь по коллекции hPageBreakes листа
у каждого элемента есть
.Location.Row
Не подскажите, когда hPageBreakes листа обновляется, т.е. пересчитывается? По какому-то событию или при обращении к элементу?
Smogg вне форума Ответить с цитированием
Старый 19.02.2015, 20:32   #8
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

Цитата:
Сообщение от Smogg Посмотреть сообщение
Не подскажите, когда hPageBreakes листа обновляется, т.е. пересчитывается? По какому-то событию или при обращении к элементу?
Ага, угадал) Обновляется именно по событию, а не при обращении к элементу.

Сначала надо так:
Код:
       lstSchetFacturaNew.Visible = xlSheetVisible
       lstSchetFacturaNew.Activate
А лишь потом так:
Код:
            Dim rwMin As Long, rwMax As Long
            
            rwMin = 23 + lbService.ListCount
            rwMax = 30 + lbService.ListCount
            
            For Each brk In lstSchetFacturaNew.HPageBreaks
                MsgBox brk.Location.Row
                If brk.Location.Row >= rwMin And brk.Location.Row <= rwMax Then
                
                    GoTo lblBrk
                End If
            Next
            
            GoTo lblNotBrk
lblBrk:
            lstSchetFacturaNew.HPageBreaks.Add Before:=Cells(22 + lbService.ListCount, 1)

lblNotBrk:
Smogg вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Копирование таблицы на нескольких страницах Word в PowerPoint Andemki Microsoft Office Word 0 08.10.2012 18:49
Ориентация листа при печати формы в Excel VictorM Microsoft Office Excel 4 19.07.2012 13:59
Программа для отслеживания изменений в веб страницах Kasim89 Фриланс 1 29.04.2012 15:29
при печати листа не печатать расположенные на ней кнопки ActiveX roborrr Microsoft Office Excel 2 27.10.2011 12:00
Разные колонтитулы на двух страницах одного листа Dorvir Microsoft Office Excel 1 14.06.2008 12:25