Я автоматизирую создание некоторых документов в офисе.На одном листе у меня есть пользователи, которые вводят данные, которые необходимо выборочно копировать в некоторые другие рабочие листы, которые будут распечатаны для использования на производственной площадке. В настоящее время у меня проблема с форматированием моего листа "Ship". Первый лист пуст.Ожидается, что пользователь будет использовать эту страницу для подведения итогов упаковочного списка, написав от руки каждую уникальную коробку, комплект и поддон, перечисленные в разделе «Тип и номер контейнера», из позиций на листе «Подготовка», которые находятся на странице 2 (+).
После запуска макроса, кажется, что Excel добавляет дополнительный разрыв страницы сразу после каждой строки, для которой я вручную устанавливаю разрывы страниц. Когда я нахожусь в представлении «Макет страницы»и переключитесь на рабочий лист «Судно», он будет иметь длину 5 страниц для данных текущего примера, которые я использую.Тем не менее, данные должны требовать только 2 страницы в дополнение к титульному листу в общей сложности 3 страницы.Страницы 2 и 4 имеют только одну строку и быстро переходят на следующую страницу при прокрутке.Кроме того, я только что заметил, что заголовок, который я использую для страниц 2+, появляется только над однострочной страницей 2, а остальная часть «страницы 2» отображается на странице 3. Заголовок вообще не отображается для страниц 4 и 5.Проблема, которую трудно уловить, заключается в том, что при предварительном просмотре печати отображается всего 3 страницы, а строки, которые должны иметь разрыв страницы, прежде чем они будут сдвинуты, будут отображаться как последняя строка предыдущей страницы.
Iпытались написать этот макрос тремя разными способами: 1. Sheet.Rows (#). PageBreak = xlPageBreakManual 2. Sheet.HPageBreaks.Add Before: = Sheet.Rows (#) 3. Sheet.HPageBreaks (#). Location = Sheet.Range («A» & #)
ПРИМЕЧАНИЕ. Я обнаружил эту статью от Microsoft после повторения ошибок «Ошибка времени выполнения 9: выход за пределы диапазона» с параметром (3),и перекодировал эту опцию соответственно https://support.microsoft.com/en-us/help/210663/you-receive-a-subscript-out-of-range-error-message-when-you-use-hpageb
Самым странным является то, что если я перейду к опции (3) построчно в режиме отладки, макрос фактически отформатирует страницу правильно..
Здесьэто соответствующий код:
Option Explicit
'Public sSht As Worksheet
'Public sDatRng As Range, pDatRng As Range, pCopyRng As Range
'Public sCopyRow As Long, pCopyRow As Long
'Public sNumRows As Long, sHeadFootRows As Long, pNumRows As Long, pHeadFootRows As Long
Sub formatShipV1(numPgs As Long)
Dim rng As Range
Dim i As Long
Dim currcell As Range
Application.PrintCommunication = False
With sSht
.Cells.PageBreak = xlPageBreakNone
With .PageSetup
.Zoom = False
.PaperSize = xlPaperLetter
.Orientation = xlPortrait
.PrintArea = sSht.Range("A1:J" & ((sNumRows + sHeadFootRows) + (numPgs * (pNumRows + pHeadFootRows)))).Address
.LeftMargin = Application.InchesToPoints(0.2)
.RightMargin = Application.InchesToPoints(0.2)
.TopMargin = Application.InchesToPoints(0.6)
.BottomMargin = Application.InchesToPoints(0.6)
.HeaderMargin = Application.InchesToPoints(0.1)
.FooterMargin = Application.InchesToPoints(0.1)
.FitToPagesWide = 1
.FitToPagesTall = numPgs + 1
.CenterHorizontally = True
.CenterVertically = False
End With
For i = 0 To (numPgs - 1)
.Rows((sNumRows + sHeadFootRows) + (i * (pNumRows + pHeadFootRows)) + 1).PageBreak = xlPageBreakManual
.Rows((sNumRows + sHeadFootRows) + (i * (pNumRows + pHeadFootRows)) + 1).RowHeight = Application.InchesToPoints(0.25)
.Rows((sNumRows + sHeadFootRows) + (i * (pNumRows + pHeadFootRows)) + 2).RowHeight = Application.InchesToPoints(0.3)
.Rows((sNumRows + sHeadFootRows) + (i * (pNumRows + pHeadFootRows)) + 3).RowHeight = Application.InchesToPoints(0.19)
.Rows((sNumRows + sHeadFootRows) + (i * (pNumRows + pHeadFootRows)) + 4).RowHeight = Application.InchesToPoints(0.57)
Set rng = sSht.Range(Cells(((sNumRows + sHeadFootRows) + (i * (pNumRows + pHeadFootRows)) + 5), 1).Address & ":" & Cells(((sNumRows + sHeadFootRows) + (i * (pNumRows + pHeadFootRows)) + 26), 10).Address)
rng.RowHeight = Application.InchesToPoints(0.38)
.Rows((sNumRows + sHeadFootRows) + (i * (pNumRows + pHeadFootRows)) + 27).RowHeight = Application.InchesToPoints(0.23)
Next
End With
Application.PrintCommunication = True
End Sub
Sub formatShipV2(numPgs As Long)
Dim rng As Range
Dim i As Long
Dim currcell As Range
Application.PrintCommunication = False
With sSht
.ResetAllPageBreaks
With .PageSetup
.Zoom = False
.PaperSize = xlPaperLetter
.Orientation = xlPortrait
.PrintArea = sSht.Range("A1:J" & ((sNumRows + sHeadFootRows) + (numPgs * (pNumRows + pHeadFootRows)))).Address
.LeftMargin = Application.InchesToPoints(0.2)
.RightMargin = Application.InchesToPoints(0.2)
.TopMargin = Application.InchesToPoints(0.6)
.BottomMargin = Application.InchesToPoints(0.6)
.HeaderMargin = Application.InchesToPoints(0.1)
.FooterMargin = Application.InchesToPoints(0.1)
.FitToPagesWide = 1
.FitToPagesTall = numPgs + 1
.CenterHorizontally = True
.CenterVertically = False
End With
For i = 0 To (numPgs - 1)
.HPageBreaks.Add Before:=sSht.Rows(((sNumRows + sHeadFootRows) + (i * (pNumRows + pHeadFootRows)) + 1))
.Rows((sNumRows + sHeadFootRows) + (i * (pNumRows + pHeadFootRows)) + 1).RowHeight = Application.InchesToPoints(0.25)
.Rows((sNumRows + sHeadFootRows) + (i * (pNumRows + pHeadFootRows)) + 2).RowHeight = Application.InchesToPoints(0.3)
.Rows((sNumRows + sHeadFootRows) + (i * (pNumRows + pHeadFootRows)) + 3).RowHeight = Application.InchesToPoints(0.19)
.Rows((sNumRows + sHeadFootRows) + (i * (pNumRows + pHeadFootRows)) + 4).RowHeight = Application.InchesToPoints(0.57)
Set rng = sSht.Range(Cells(((sNumRows + sHeadFootRows) + (i * (pNumRows + pHeadFootRows)) + 5), 1).Address & ":" & Cells(((sNumRows + sHeadFootRows) + (i * (pNumRows + pHeadFootRows)) + 26), 10).Address)
rng.RowHeight = Application.InchesToPoints(0.38)
.Rows((sNumRows + sHeadFootRows) + (i * (pNumRows + pHeadFootRows)) + 27).RowHeight = Application.InchesToPoints(0.23)
Next
End With
Application.PrintCommunication = True
End Sub
Sub formatShipV3(numPgs As Long)
Dim rng As Range
Dim i As Long
Dim currcell As Range
Call endOptimize
Set currcell = ActiveCell
Range("IV65536").Select
Application.PrintCommunication = False
With sSht
.Activate
ActiveWindow.View = xlPageBreakPreview
.ResetAllPageBreaks
With .PageSetup
.Zoom = False
.PaperSize = xlPaperLetter
.Orientation = xlPortrait
.PrintArea = sSht.Range("A1:J" & ((sNumRows + sHeadFootRows) + (numPgs * (pNumRows + pHeadFootRows)))).Address
.LeftMargin = Application.InchesToPoints(0.2)
.RightMargin = Application.InchesToPoints(0.2)
.TopMargin = Application.InchesToPoints(0.6)
.BottomMargin = Application.InchesToPoints(0.6)
.HeaderMargin = Application.InchesToPoints(0.1)
.FooterMargin = Application.InchesToPoints(0.1)
.FitToPagesWide = 1
.FitToPagesTall = numPgs + 1
.CenterHorizontally = True
.CenterVertically = False
End With
For i = 0 To (numPgs - 1)
Set .HPageBreaks(i + 1).Location = sSht.Range("A" & ((sNumRows + sHeadFootRows) + (i * (pNumRows + pHeadFootRows)) + 1))
DoEvents
.Rows((sNumRows + sHeadFootRows) + (i * (pNumRows + pHeadFootRows)) + 1).RowHeight = Application.InchesToPoints(0.25)
.Rows((sNumRows + sHeadFootRows) + (i * (pNumRows + pHeadFootRows)) + 2).RowHeight = Application.InchesToPoints(0.3)
.Rows((sNumRows + sHeadFootRows) + (i * (pNumRows + pHeadFootRows)) + 3).RowHeight = Application.InchesToPoints(0.19)
.Rows((sNumRows + sHeadFootRows) + (i * (pNumRows + pHeadFootRows)) + 4).RowHeight = Application.InchesToPoints(0.57)
Set rng = sSht.Range(Cells(((sNumRows + sHeadFootRows) + (i * (pNumRows + pHeadFootRows)) + 5), 1).Address & ":" & Cells(((sNumRows + sHeadFootRows) + (i * (pNumRows + pHeadFootRows)) + 26), 10).Address)
rng.RowHeight = Application.InchesToPoints(0.38)
.Rows((sNumRows + sHeadFootRows) + (i * (pNumRows + pHeadFootRows)) + 27).RowHeight = Application.InchesToPoints(0.23)
Next
ActiveWindow.View = xlPageLayoutView
End With
Application.PrintCommunication = True
sSht.Activate
sSht.Range(currcell.Address).Select
Call startOptimize
End Sub
Sub startOptimize()
Application.ScreenUpdating = False
Application.DisplayStatusBar = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
ActiveSheet.DisplayPageBreaks = False
End Sub
Sub endOptimize()
Application.ScreenUpdating = True
Application.DisplayStatusBar = True
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
ActiveSheet.DisplayPageBreaks = True
End Sub
'Sub runMacro()
' Call startOptimize
' ...
' Dim sNumSht As Long
' ...
' Other variable declarations
' ...
' Set sSht = datBk.Worksheets("Ship")
' Set sDatRng = sSht.Range("B6:J27")
' Set pDatRng = sSht.Range("B32:J53")
' Set pCopyRng = sSht.Range("A28:J54")
' sNumRows = 22
' sHeadFootRows = 5
' pCopyRow = 55
' pNumRows = 22
' pHeadFootRows = 5
' ...
' Other variable initializations
' ...
' Code to calculate what data to copy to the "Ship" sheet, and how many pages "sNumSht" should equal
' ...
' Call formatShipV1((sNumSht + 1))
' '-OR-
' Call formatShipV2((sNumSht + 1))
' '-OR-
' Call formatShipV3((sNumSht + 1))
' ...
' Code to copy previously determined data to ship sheet
' ...
' Code to execute the rest of the macro
' ...
' Call endOptimize
'End Sub
Ожидаемое форматирование листа «Корабль» [производится с помощью опции «шаг в» (3)]:
Факт.форматирование листа «Корабль» (параметры 1-3 при нормальной работе):
-Как отображается в Excel (отображается только страница 1-3 из 5):
-Asраспечатывается в PDF с помощью предварительного просмотра в Excel: