Vba excel как вставить разрыв страницы

 

Sla_0412

Пользователь

Сообщений: 206
Регистрация: 17.11.2013

В моем примере необходимо вставлять вертикальный разрыв страницы на следующих условиях:
Если в полях проверки стоят «графика» и «номер» то разрыв перемещаем до текста выше. Текстовых строк может быть от 0 и более между графикой. Графика всегда 8 строк.
Предполагается что данных много, выполнять надо в цикле как я понимаю…

Изменено: Sla_041219.03.2020 19:01:14

 

Kuzmich

Пользователь

Сообщений: 7998
Регистрация: 21.12.2012

#2

29.04.2015 20:06:04

Цитата
как я понимаю…

А я, так понимаю, что нужен горизонтальный разрыв

 

Sla_0412

Пользователь

Сообщений: 206
Регистрация: 17.11.2013

да, мне нужно только по горизонтали

 

Kuzmich

Пользователь

Сообщений: 7998
Регистрация: 21.12.2012

#4

29.04.2015 20:08:54

И еще, сколько строк умещается на странице?
Используйте

Цитата
ActiveSheet.HPageBreaks.Add ячейка

разрыв над ячейкой

Изменено: Kuzmich05.05.2015 14:55:22

 

Sla_0412

Пользователь

Сообщений: 206
Регистрация: 17.11.2013

Проблема состоит в том что при использовании ActiveSheet.HPageBreaks.Add ячейка, я смог только сдвинуть первый разрыв, который влияет на последующие разрывы ниже по строкам. те никак не соображу как зациклить обработку если информация всегда размещается вразнобой.(листов множество и комбинации текста и графики разные)

 

Kuzmich

Пользователь

Сообщений: 7998
Регистрация: 21.12.2012

#6

29.04.2015 21:30:53

Попробуйте так

Код
Sub Razdel_31()
Dim i As Long
Dim iLastRow As Long
Dim iPage As Long
    iLastRow = Cells(Rows.Count, 4).End(xlUp).Row
      iPage = 1
  For i = 1 To iLastRow
    Do
      If Cells(i, 5) = "графика" Then
        If i + 7 >= 32 * iPage Then Exit Do
        i = i + 8
      Else
        If i + 1 >= 32 * iPage Then Exit Do
        i = i + 1
      End If
    Loop While i < 32 * iPage
        ActiveSheet.HPageBreaks.Add Cells(i + 1, 1)
      iPage = iPage + 1
  Next
End Sub
 

Sla_0412

Пользователь

Сообщений: 206
Регистрация: 17.11.2013

Я может как то неправильно описал задачу, но во первых, файл выложен как пример и привязываться к его размерам высоты строк а так же к ориентации листа никак нельзя. Предполагается использовать метод для разных целей (отчеты разных документов) , на разных компьютерах, с разными принтерами. Во-вторых , он даже в том виде в котором есть, не отрабатывает  свою задачу.(Это легко проверить скопировав текст примера вниз и продолжив ряд строк.
Я вижу алгоритм так: находим первый разрыв, смещаем его на n количество строк вверх до текста. Далее повторяем задачу до конца. Фишка в том что при смещении первого разрыва, остальные «переходят» тоже вверх.

 

RAN

Пользователь

Сообщений: 7091
Регистрация: 21.12.2012

#8

29.04.2015 23:01:43

Цитата
Sla_0412 написал: Фишка в том что при смещении первого разрыва, остальные «переходят» тоже вверх.

И?
По по очереди проверяем все разрывы, если нужно — двигаем.

 

Kuzmich

Пользователь

Сообщений: 7998
Регистрация: 21.12.2012

#9

29.04.2015 23:09:21

Попробуйте так

Код
Sub Razdel_31()
Dim i As Long
Dim iLastRow As Long
Dim iPage As Long
Dim iHPBreak As HPageBreak
Dim KolStrok As Long
   For Each iHPBreak In ActiveSheet.HPageBreaks
    iHPBreak.Delete
   Next
  KolStrok = ActiveSheet.HPageBreaks(1).Location.Row - 1
    iLastRow = Cells(Rows.Count, 4).End(xlUp).Row
      iPage = 1
  For i = 1 To iLastRow
    Do
      If Cells(i, 5) = "графика" Then
        If i + 8 >= KolStrok * iPage Then Exit Do
        i = i + 8
      Else
        If i + 1 >= KolStrok * iPage Then Exit Do
        i = i + 1
      End If
    Loop While i <= KolStrok * iPage
        ActiveSheet.HPageBreaks.Add Cells(i, 1)
      iPage = iPage + 1
  Next
End Sub
 

Sla_0412

Пользователь

Сообщений: 206
Регистрация: 17.11.2013

Все работает, но нужно вставить между строкой 6 и 7 On Error Resume Next.
Выражаю огромную благодарность Kuzmich.

 

temash

Пользователь

Сообщений: 13
Регистрация: 21.04.2015

Здравствуйте! У меня вопрос по этой теме. мне надо поставить разрыв перед словом «карточка» (т.е. каждая карточка должна начинаться с новой страницы при печати).
предыдущий макрос у меня почему-то не сработал, наверное там надо что-то поменять, кроме слова графика?
помогите пожалуйста.

 

Kuzmich

Пользователь

Сообщений: 7998
Регистрация: 21.12.2012

#12

02.06.2015 12:49:00

Попробуйте так Параметры страницы — Поля верхнее 1, нижнее — 1,5 колонтитулы — 0

Код
Sub Razdel_31()
Dim i As Long
Dim iLastRow As Long
Dim iPage As Long
Dim iHPBreak As HPageBreak
Dim KolStrok As Long
    On Error Resume Next
   For Each iHPBreak In ActiveSheet.HPageBreaks
    iHPBreak.Delete
   Next
  KolStrok = ActiveSheet.HPageBreaks(1).Location.Row - 1
    iLastRow = Cells(Rows.Count, 34).End(xlUp).Row
      iPage = 1
  For i = 2 To iLastRow
    Do
      If Cells(i, 21) = "КАРТОЧКА" Then
        If i + 60 >= KolStrok * iPage Then Exit Do
        i = i + 60
      Else
        If i + 1 >= KolStrok * iPage Then Exit Do
        i = i + 1
      End If
    Loop While i <= KolStrok * iPage
        ActiveSheet.HPageBreaks.Add Cells(i, 1)
      iPage = iPage + 1
  Next
End Sub



 

temash

Пользователь

Сообщений: 13
Регистрация: 21.04.2015

Kuzmich, спасибо, работает!!!

 

temash

Пользователь

Сообщений: 13
Регистрация: 21.04.2015

#14

02.06.2015 18:23:24

захотела сама подогнать макрос под другой файл… видно не дано….. посмотрите, что не так?

Код
Sub Razdel_31()
Dim i As Long
Dim iLastRow As Long
Dim iPage As Long
Dim iHPBreak As HPageBreak
Dim KolStrok As Long
    On Error Resume Next
   For Each iHPBreak In ActiveSheet.HPageBreaks
    iHPBreak.Delete
   Next
  KolStrok = ActiveSheet.HPageBreaks(1).Location.Row - 1
    iLastRow = Cells(Rows.Count, 130).End(xlUp).Row
      iPage = 1
  For i = 2 To iLastRow
    Do
      If Cells(i, 1) = "Расчетный листок за Май 2015" Then
        If i + 25 >= KolStrok * iPage Then Exit Do
        i = i + 25
      Else
        If i + 1 >= KolStrok * iPage Then Exit Do
        i = i + 1
      End If
    Loop While i <= KolStrok * iPage
        ActiveSheet.HPageBreaks.Add Cells(i, 1)
      iPage = iPage + 1
  Next
End Sub

Прикрепленные файлы

  • пример2.xlsx (57.03 КБ)

 

RAN

Пользователь

Сообщений: 7091
Регистрация: 21.12.2012

#15

02.06.2015 19:44:22

Макрос попроще

Код
Sub q()
    Dim r As Range
    Set r = Cells.Find(What:="Расчетный листок", LookAt:=xlPart)
    If Not r Is Nothing Then
        Do
            If r Is Nothing Or r.Row = 1 Then Exit Do
            ActiveSheet.HPageBreaks.Add r
            Set r = Cells.FindNext(r)
        Loop
    End If
End Sub
 

Kuzmich

Пользователь

Сообщений: 7998
Регистрация: 21.12.2012

#16

02.06.2015 20:26:06

Цитата
посмотрите, что не так?

В 130 столбце нет данных, ищите последнюю строку по первому столбцу

Код
 iLastRow = Cells(Rows.Count, 130).End(xlUp).Row
 

temash

Пользователь

Сообщений: 13
Регистрация: 21.04.2015

RAN, спасибо большое, работает
Kuzmich, поняла, спасибо

ВЫ ГЕНИИ!!!!!

 

eka0043

Пользователь

Сообщений: 1
Регистрация: 16.05.2019

Ребята, помогите, плиз прописать макрос. У самой ничего не получается. В табличке, которая прикреплена,  нужен разрыв страницы по первой колонке «ветка». И чтобы на одной страничке было только 23 строки.
Буду очень благодарна за помощь

 

adventy

Пользователь

Сообщений: 24
Регистрация: 05.04.2013

#19

19.03.2020 17:48:19

Цитата
RAN написал:
Макрос попроще

Добрый день.
Подскажите, пожалуйста, какие изменения нужно внести в Ваш макрос, чтобы разрывы проставлялись каждые N строк (например, каждые 30 строк)?

 

Kuzmich

Пользователь

Сообщений: 7998
Регистрация: 21.12.2012

#20

20.03.2020 13:35:29

Цитата
чтобы на одной страничке было только 23 строки.
Код
Sub ВставитьРазрыв()   
Dim i As Long
Dim iLastRow As Long
  iLastRow = Cells(Rows.Count, "A").End(xlUp).Row
  ActiveSheet.ResetAllPageBreaks
    i = 24
 Do While i < iLastRow
    ActiveSheet.HPageBreaks.Add ActiveSheet.Range("A" & i)
    i = i + 23
 Loop
End Sub

Изменено: Kuzmich20.03.2020 14:58:53

 

adventy

Пользователь

Сообщений: 24
Регистрация: 05.04.2013

Спасибо

Kuzmich

, я это тоже искал!

 

Vitalio

Пользователь

Сообщений: 8
Регистрация: 09.04.2019

#22

21.10.2020 13:34:43

Здравствуйте, уважаемые!

Если можете, помогите, пожалуйста, с похожей задачей.

Есть стандартная накладная в которой есть шапка накладной, тело (таблица с товарами), а так же подписи.
При печати документа бывает так, что подпись (или ее часть) отрываются от основной части таблицы.
Параметры печати: вписать все столбцы на одном листе. Все поля по 0,8 см. Колонтитулы по 0 см.

Можно ли проверить находятся начало подписи и конец на одном листе и, если да, то проверить не оторвана ли подпись от основной таблицы? И в зависимости от сложности реализации или уменьшить на 1 выводимые на печать количество страниц или добавить разрыв перед последней строкой табличной части?

Визуально можно посмотреть в прилагаемом файле.

Прикрепленные файлы

  • разрыв страницы.xlsx (93.08 КБ)

Изменено: Vitalio21.10.2020 13:35:13
(Добавил файл)

In this Article

  • Page Break View Mode
  • Insert Page Breaks
  • Delete Page Break
  • Move Page Breaks
  • Reset Page Breaks
  • Hide Page Breaks in Normal View
  • Page Breaks – VBA

If you don’t manually set Page Breaks, Excel will do it’s best to set appropriate Page Breaks. However, if you’ve ever tried to print an Excel spreadsheet, you know it generally does not do a good job.

Any time you print a spreadsheet you should review and edit the Page Breaks before printing.

Page Break View Mode

Because page breaks are not shown by default in Excel, you will want to switch to Page Break Preview view mode in order to work effectively with them.

To switch from Normal View to Page Break Preview, activate the View Ribbon Menu. Then select Page Break Preview (ALT > W > I).

page break preview mode

Below is an example of what the view looks like. A dashed line represents an automatic page break whereas solid lines stand for manual page breaks.
insert horizontal row page break excel vba

Tip: To go back to Normal View, go to View Ribbon > Normal (directly next to Page Break Preview) (ALT > W > L).

<!–Ads3–>

Insert Page Breaks

To insert a row (horizontal) page break, highlight the row directly below where you want to place the break. Then navigate to the Layout Ribbon Menu and select Breaks > Insert Page Break (ALT > P > B > I).
insert column page break excel vba

Result:
insert horizontal row page break excel vba
Tip: The SHIFT + SPACE shortcut allows you to conveniently select an entire row.

Follow the same steps to insert a column (vertical) Page Break. Select the column directly to the right of where you want to place your break. Then go to Page Layout > Breaks > Insert Page Break (ALT > P > B > I).

insert column vertical page break excel vba

Tip: The CTRL + SPACE shortcut allows you to conveniently select an entire column.

Delete Page Break

To delete page breaks you can use almost exact same steps as if you were to insert one. Select the row below or column to the right of the page break and perform these steps:

Under the Page Layout Ribbon Menu, select Breaks then Remove Page Break (ALT > P > B > R)

remove column page breaks excel vba
Note: Automatic page breaks cannot be deleted

Move Page Breaks

If you happen to mess up where you placed your breaks, don’t fret. You can simply move them to the desired location.

Activate Page Break Preview (ALT > W > I), and simply hover over any page break lines until the <-> shows up then drag it to the desired location.

Warning: If you happen to move an automatic page break, it will turn into its manual counterpart.

<!–Ads1–>

Reset Page Breaks

Sometimes, you want to reset all of the Page Breaks in a worksheet..

On the ribbon, head back to where you would insert a page break and select the reset option (ALT > P > B > A)

reset all page breaks excel vba

Hide Page Breaks in Normal View

Page breaks may appear in Normal View Mode; they can be useful or an eye sore. To hide them, follow these steps:

Click the File tab on the ribbon then select Options on the left menu:

excel page break options

Then navigate to the Advanced subtab in the left menu. Scroll down to Display options for this worksheet and unselect Show Page Breaks.

remove page breaks from normal view mode excel

<!–Ads2–>

Page Breaks – VBA

Everything mentioned above can also be accomplished using VBA using these code examples:

‘Add Row Page Break
Worksheets("Sheet1").Rows(40).PageBreak = xlPageBreakManual

‘Add Column Page Break
Worksheets("Sheet1").Columns("Z").PageBreak = xlPageBreakManual

‘Clear Row Page Break
Worksheets("Sheet1").Rows(40).PageBreak = xlPageBreakNone 

‘Clear Column Page Break’
Worksheets("Sheet1").Columns("Z").PageBreak = xlPageBreakNone

‘Set Activesheet to Page Break Preview Mode
ActiveWindow.View = xlPageBreakPreview

‘Restore Activesheet to Normal View Mode
ActiveWindow.View = xlNormalView

Для вас может быть легко и просто вставить разрыв страницы в рабочий лист. Иногда требуется вставить разрывы страниц в каждые X строк для аккуратной печати, как бы вы могли это сделать? Здесь я представлю несколько методов решения этой проблемы в Excel.

  • Вставить разрыв страницы каждые X строк с помощью VBA в Excel
  • Пакетная вставка разрывов страниц после каждых x строк
  • Пакетная вставка разрывает страницу после каждых x строк с добавлением заголовка строки над каждыми x строками

Вставить разрыв страницы каждые X строк с помощью VBA в Excel

Возможно, вы не знакомы с ранее запущенным VBA, но, выполнив следующие действия, вы сможете узнать, как запустить VBA для вставки разрыва страницы через каждые X строк. Здесь я буду вставлять разрыв страницы через каждые 3 строки.

1, нажмите Alt + F11 для отображения Microsoft Visual Basic для приложений окно.

2. В окне нажмите Вставить > Модули чтобы отобразить новое окно модуля, затем скопируйте следующий код VBA в окно модуля.

VBA: вставлять разрыв страницы в каждые X строк на листе.

Sub InsertPageBreaks()
'Updateby20140618
Dim xLastrow As Long
Dim xWs As Worksheet
Set xWs = Application.ActiveSheet
xRow = Application.InputBox("Row", xTitleId, "", Type:=1)
xWs.ResetAllPageBreaks
xLastrow = xWs.Range("A1").SpecialCells(xlCellTypeLastCell).Row
For i = xRow + 1 To xLastrow Step xRow
    xWs.HPageBreaks.Add Before:=xWs.Cells(i, 1)
Next
End Sub

3. Нажмите Run и появляется диалоговое окно, в котором вы можете указать каждые X строк, в которые вы хотите вставить разрыв страницы. Здесь я вставляю разрыв страницы в каждые 3 строки. Смотрите скриншот:
док-вставка-страница-разрыв-x-строки-1

4. Нажмите OK, а затем вставит разрыв страницы в каждые X строк.

Быстро вставлять разрыв страницы в каждую (n-ю) строку активного листа

Обычно мы вставляем один разрыв страницы при нажатии Макет страницы > Перерывы > Вставить разрыв страницы. Но таким образом слишком утомительно вставлять несколько разрывов страниц в лист, например, вам нужно вставлять один разрыв страницы в каждую строку для печати каждой строки на отдельной странице. Не волнуйся! Kutools for ExcelАвтора Вставить разрыв страницы в каждую строку утилита поможет вам легко его заархивировать!

рекламная вставка разрыв страницы в каждой строке 3

Пакетная вставка разрывов страницы после каждых x строк с Kutools for Excel

Если у вас есть Kutools for Excel установлен, его Разделить на столбцы Утилита может помочь вам пакетно вставлять несколько разрывов страниц после каждых x строк, легко сохраняя заголовок на каждой странице в Excel.

1. Нажмите Разделить на столбцы на Кутулс Плюс меню.

2. В открывшемся диалоговом окне Разделить на столбцы вам необходимо:

(1) Нажмите кнопку «Обзор».  в Диапазон названий и выберите строку заголовка в указанном диапазоне, в который вы будете вставлять разрывы страниц.
(2) Нажмите кнопку «Обзор». в Диапазон дат и выберите диапазон, в который вы будете выполнять пакетную вставку разрывов страниц.
(3) В Строк на печатной странице поле введите число. (Функции: Например, если вам нужно вставить разрывы страниц после каждых 3 строк, введите 3 в поле; если вам нужно инертить разрывы страниц после каждой строки, введите 1.)
(4) Введите 1 в Количество сегментов пунктом.

3, Нажмите Ok кнопку.

Теперь вы увидите, что диапазон копируется на новый лист, а разрывы страниц добавляются после каждых x строк с сохранением заголовка диапазона. Вы также можете переключиться в режим предварительного просмотра разрыва страницы, нажав Вид > Предварительный просмотр разрыва страницы чтобы увидеть эти разрывы страниц. См. Снимок экрана ниже.

Kutools for Excel — Включает более 300 удобных инструментов для Excel. Полнофункциональная бесплатная пробная версия 30-день, кредитная карта не требуется! Get It Now


Вставить разрывы страниц после каждых x строк с помощью Kutools for Excel

Kutools for Excel разрабатывает еще одну утилиту Insert Page Break Every Row, специализирующуюся на вставке разрывов страниц после каждых x строк.

1. Выберите диапазон, в который вы будете вставлять разрывы страниц после каждых x строк, и нажмите печать > Вставить разрыв страницы в каждую строку на Кутулс Плюс меню.

2. В открывшемся диалоговом окне «Вставить разрыв страницы в каждую строку» укажите интервал строк, в которые вы будете вставлять разрывы страниц, и щелкните значок Ok кнопку.

Тогда вы увидите, что разрывы страниц вставляются сразу с заданным интервалом строк.

Kutools for Excel — Включает более 300 удобных инструментов для Excel. Полнофункциональная бесплатная пробная версия 30-день, кредитная карта не требуется! Get It Now


Демонстрация: вставляйте разрыв страницы каждые x строк в Excel


Относительные статьи:

  • Вставить или удалить разрыв страницы в Excel

Лучшие инструменты для работы в офисе

Kutools for Excel Решит большинство ваших проблем и повысит вашу производительность на 80%

  • Снова использовать: Быстро вставить сложные формулы, диаграммы и все, что вы использовали раньше; Зашифровать ячейки с паролем; Создать список рассылки и отправлять электронные письма …
  • Бар Супер Формулы (легко редактировать несколько строк текста и формул); Макет для чтения (легко читать и редактировать большое количество ячеек); Вставить в отфильтрованный диапазон
  • Объединить ячейки / строки / столбцы без потери данных; Разделить содержимое ячеек; Объединить повторяющиеся строки / столбцы… Предотвращение дублирования ячеек; Сравнить диапазоны
  • Выберите Дубликат или Уникальный Ряды; Выбрать пустые строки (все ячейки пустые); Супер находка и нечеткая находка во многих рабочих тетрадях; Случайный выбор …
  • Точная копия Несколько ячеек без изменения ссылки на формулу; Автоматическое создание ссылок на несколько листов; Вставить пули, Флажки и многое другое …
  • Извлечь текст, Добавить текст, Удалить по позиции, Удалить пробел; Создание и печать промежуточных итогов по страницам; Преобразование содержимого ячеек в комментарии
  • Суперфильтр (сохранять и применять схемы фильтров к другим листам); Расширенная сортировка по месяцам / неделям / дням, периодичности и др .; Специальный фильтр жирным, курсивом …
  • Комбинируйте книги и рабочие листы; Объединить таблицы на основе ключевых столбцов; Разделить данные на несколько листов; Пакетное преобразование xls, xlsx и PDF
  • Более 300 мощных функций. Поддерживает Office/Excel 2007-2021 и 365. Поддерживает все языки. Простое развертывание на вашем предприятии или в организации. Полнофункциональная 30-дневная бесплатная пробная версия. 60-дневная гарантия возврата денег.

вкладка kte 201905


Вкладка Office: интерфейс с вкладками в Office и упрощение работы

  • Включение редактирования и чтения с вкладками в Word, Excel, PowerPoint, Издатель, доступ, Visio и проект.
  • Открывайте и создавайте несколько документов на новых вкладках одного окна, а не в новых окнах.
  • Повышает вашу продуктивность на 50% и сокращает количество щелчков мышью на сотни каждый день!

офисный дно

Комментарии (3)


Оценок пока нет. Оцените первым!

Запись от Alex_Gur размещена 24.09.2015 в 15:15

Обновил(-а) Alex_Gur 28.01.2016 в 11:56


Работа со страницами в Excel и в Word существенно отличается из-за различия в объектных моделях Excel и Word.
Если в Word страницы входят в коллекцию

Visual Basic
1
ActiveDocument.ActiveWindow.Panes(1).Pages

и обращение к ним производится по типу:

Visual Basic
1
ActiveDocument.ActiveWindow.Panes(1).Pages(1).Rectangles(1).Range.Text

то в Excel работа со страницами производится с помощью коллекций разрывов страниц соответственно по вертикали и по горизонтали

Visual Basic
1
ActiveSheet.HPageBreaks

и

Visual Basic
1
ActiveSheet.VPageBreaks

.

Приведенные далее макросы для работы со страницами в Excel нужно помещать в модули группы Modules.

Количество страниц по вертикали

Visual Basic
1
2
3
4
5
Sub GetPrintPagesCount1()
   Dim intPagesCount As Integer
   intPagesCount = ActiveSheet.HPageBreaks.Count + 1
   MsgBox "Количество страниц по вертикали: " & intPagesCount
End Sub

Количество страниц по горизонтали

Visual Basic
1
2
3
4
5
Sub GetPrintPagesCount1()
   Dim intPagesCount As Integer
   intPagesCount = ActiveSheet.VPageBreaks.Count + 1
   MsgBox "Количество страниц по горизонтали: " & intPagesCount
End Sub

Проверка количества страниц по горизонтали (если оно не должно превышать 1)

Visual Basic
1
2
3
4
5
6
7
8
9
Sub GetPrintPagesCount1()
    Dim intPagesCount As Integer
    intPagesCount = ActiveSheet.VPageBreaks.Count + 1
    If intPagesCount > 1 Then
        MsgBox "Файл не умещается в ширину на страницу. Количество страниц по горизонтали: " & intPagesCount
    Else
        MsgBox "Файл умещается в ширину на страницу. Количество страниц по горизонтали: 1"
    End If
End Sub

Общее количество страниц на активном листе

Visual Basic
1
2
3
4
5
6
Sub GetPrintPagesCount1()
   Dim intPagesCount As Integer
   intPagesCount = (ActiveSheet.HPageBreaks.Count + 1) * _
       (ActiveSheet.VPageBreaks.Count + 1)
   MsgBox "Всего страниц: " & intPagesCount
End Sub

или

Visual Basic
1
2
3
Sub pages01()
    MsgBox Worksheets(1).PageSetup.Pages.Count
End Sub

Количество страниц на всех листах книги

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Sub GetPrintPagesCount()
   Dim wshtSheet As Worksheet
   Dim intPagesCount As Integer
   ' Суммирование количества страниц, необходимых для печати всех _
    листов книги
   For Each wshtSheet In Worksheets
      intPagesCount = intPagesCount + (wshtSheet.HPageBreaks.Count + 1) * _
       (wshtSheet.VPageBreaks.Count + 1)
   Next
   MsgBox "Всего страниц: " & intPagesCount
End Sub

Вставка пользователем разрыва страницы

Пользовательский разрыв страницы устанавливается над ячейкой, указанной в качестве параметра Before.

Visual Basic
1
2
3
4
Sub HPageBreaksAdd1()
    ' Вставить разрыв страницы
    ActiveWindow.SelectedSheets.HPageBreaks.Add Before:=ActiveCell
End Sub

Вместо ячейки ActiveCell в данном коде можно указать ячейку с определенным произвольным адресом.

Внимание! После установки пользовательского разрыва страницы автоматические разрывы, устанавливаемые программой перед печатью, могут быть автоматически изменены.

Удаление пользовательского разрыва страницы с определенным номером

Все символы Разрыв страницы (как пользовательские, так и установленные программой автоматически для деления на страницы для печати) входят в коллекцию HPageBreaks и имеют в этой коллекции свой уникальный номер. Зная этот номер, можно легко удалить пользовательский разрыв страницы.

Visual Basic
1
2
3
4
5
Sub HPageBreaksDel1()
' Удалить разрыв страницы
    ActiveSheet.HPageBreaks(4).Delete
    ' 4 - это порядковый номер удаляемого пользовательского разрыва страницы
End Sub

Удаление пользовательского разрыва страницы над указанной ячейкой

Удаление производится, если над указанной ячейкой действительно был установлен пользовательский разрыва страницы.

Visual Basic
1
2
3
4
5
6
7
8
Sub HPageBreaksDel2()
    Dim i As Integer
    For i = 1 To ActiveSheet.HPageBreaks.Count
        If ActiveSheet.HPageBreaks(i).Location.Row = ActiveCell.Row Then
            ActiveSheet.HPageBreaks(i).Delete
        End If
    Next
End Sub

Вместо ячейки ActiveCell в данном коде можно указать ячейку с определенным произвольным адресом.

Печать только первой страницы

Visual Basic
1
2
3
Private Sub Workbook_BeforePrint(Cancel As Boolean)
    Sheets("Sheet1").PrintOut From:=1, To:=1
End Sub

Всего комментариев

This is completely brilliant — thank you!

For those who might be interested in creating VERTICAL page breaks — eg for each year in a cash flow — I share my code as below:

Sub pagebreaks()
'insert the required page breaks automatically
' see https://stackoverflow.com/questions/51632995/inserting-page-break-with-vba

    Dim ws As Worksheet
    Dim overallendcol As Long
    Dim mycol As Long
    
'set the working sheet
    Set ws = Sheets("cf mthly")

'clear existing page breaks
    ActiveWindow.View = xlNormalView
    ActiveSheet.Cells.pagebreak = xlPageBreakNone

'establish the first new year column
    Cells(1, 1).Select
    Cells.Find(What:="Jan", After:=ActiveCell, LookIn:= _
        xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:= _
        xlNext, MatchCase:=False, SearchFormat:=False).Activate
    newyearcol = ActiveCell.Column

'establish the overall last column
    Cells(1, 1).Select
    Cells.Find(What:="totals", After:=ActiveCell, LookIn:= _
        xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:= _
        xlNext, MatchCase:=False, SearchFormat:=False).Activate
    overallendcol = ActiveCell.Column

'establish each new year column
    Cells(1, 1).Select
    For mycol = newyearcol To overallendcol - 1 Step 12
        ws.Columns(newyearcol).pagebreak = xlPageBreakManual
    Next mycol

End Sub

As part of an overhaul of a report generator I saw what I believed to be inefficient code. This part of the code runs after the main report is generated to set the page breaks in logical positions. The criteria is this:

  • Each Site starts on a new page.
  • Group’s aren’t allowed to broken across pages.

The code follows the above format: 2 loops doing those jobs.

This is the original code (sorry for the length):

Public Sub PageBreak(ByRef wstWorksheet As Excel.Worksheet, ByVal pctProgress As ProgressCtl.ProgressControl)
Dim breaksMoved As Integer
Dim p As HPageBreak
Dim i As Integer

'Used as a control value
breaksMoved = 1

' Marks that no rows/columns are to be repeated on each page
wstWorksheet.Activate
wstWorksheet.PageSetup.PrintTitleRows = ""
wstWorksheet.PageSetup.PrintTitleColumns = ""

'If this isn't performed beforehand, then the HPageBreaks object isn't available
Range("A3").Select
ActiveWindow.View = xlPageBreakPreview

'Defaults the print area to be the entire sheet
wstWorksheet.DisplayPageBreaks = False
wstWorksheet.PageSetup.PrintArea = ""

Range("$B$4").Select

' add breaks after each site
Do While ActiveCell.Row <= wstWorksheet.UsedRange.Rows.Count
    If ActiveCell.FormulaR1C1 = "Site ID" Then
        ActiveCell.PageBreak = xlPageBreakManual
    End If
    ActiveCell.Offset(1, 0).Activate
    pctProgress.ProgressText = "Row " & CStr(ActiveCell.Row) & " of " & CStr(wstWorksheet.UsedRange.Rows.Count)
Loop

Dim passes As Long
Do While breaksMoved = 1
    passes = passes + 1
    breaksMoved = 0
    For i = 1 To wstWorksheet.HPageBreaks.Count - 1
            Set p = wstWorksheet.HPageBreaks.Item(i)
            'Selects the first page break
            Range(p.Location.Address).Select
            'Sets the ActiveCell to 1 row above the page break
            ActiveCell.Offset(-1, 0).Activate

            'Move the intended break point up to the first blank section
            Do While Not ActiveCell.FormulaR1C1 = ""
                ActiveCell.Offset(-1, 0).Activate
                breaksMoved = 1
            Loop

            'Add the page break
            If ActiveCell.FormulaR1C1 <> "Site ID" Then
                ActiveCell.Offset(1, 0).Activate
                wstWorksheet.HPageBreaks.Add ActiveCell
            End If

            pctProgress.ProgressText = "Set break point " & CStr(passes) & "." & CStr(i)

    Next

Loop

'Reset the view to normal
wstWorksheet.DisplayPageBreaks = True
ActiveWindow.View = xlNormalView
Range("A3").Select
End Sub

Seeing room for improvement I set about modifying this. As one of the new requirements the people wanting the report were manually removing pages prior to printing. So I added checkboxes on another page and copied the checked items across. To ease that I used named ranges. I used these named ranges to meet the first requirement:

' add breaks after each site   
For Each RangeName In ActiveWorkbook.Names
    If Mid(RangeName.Name, 1, 1) = "P" Then
        Range(RangeName).Activate
        ActiveCell.Offset(Range(RangeName).Rows.Count - 1, 0).Select
        ActiveCell.PageBreak = xlPageBreakManual
    End If
Next RangeName

All Ranges are prefixed with P_ (for parent). Using the lame Now() style of rough timing this is 1 second slower on my short 4 site report and the more challenging 15 site report. These have 606 and 1600 rows respectively.

1 second isn’t so bad. Lets look at the next criteria.
Each logical group is split by a blank row, so the easiest way is to find the next page break, step back until you find the next blank line and insert the new break. Rinse and repeat.

So why does the original run through multiple times? We can improve that too (the boiler plate outside the loops is the same).

Dim i As Long
Dim oPageBreak As HPageBreak
Do While i < shtDeliveryVariance.HPageBreaks.Count - 1
    i = i + 1
    pctProgress.ProgressText = "Setting Page Break " & CStr(i) & " of " & CStr(shtDeliveryVariance.HPageBreaks.Count)

    Set oPageBreak = shtDeliveryVariance.HPageBreaks.Item(i)

    ' select the page break
    Range(oPageBreak.Location.Address).Select
    ActiveCell.Offset(-1, 0).Activate

    ' move up to a free row
    Do While Not ActiveCell.FormulaR1C1 = ""
        ActiveCell.Offset(-1, 0).Activate
    Loop

    'Add the page break
    If ActiveCell.FormulaR1C1 <> "Site ID" Then
        ActiveCell.Offset(1, 0).Activate
        shtDeliveryVariance.HPageBreaks.Add ActiveCell
    End If

Loop

One pass and more elegant too. But how much quicker is it? On the small test is takes 54 seconds compared to the original 45 seconds, and on the larger test my code is slower again at 153 to 130 seconds. And this is averaged over 3 runs too.

So my questions are: Why is my newer code so much slower than the original despite mine looking faster and what can I do to speed up the slowness of the code?

Note: Screen.Updating, etc. is already off as is Calculation etc.

Like this post? Please share to your friends:
  • Vba excel как вставить картинку в ячейку excel
  • Vba excel как вставить кавычки в строку
  • Vba excel как вставить значение в ячейку
  • Vba excel как вставить дату
  • Vba excel как включить вкладку