Неожиданное ручное поведение разрыва страницы.Почему Excel добавляет дополнительные разрывы / разрывы страниц в неправильном ряду? - PullRequest
0 голосов
/ 16 февраля 2019

Я автоматизирую создание некоторых документов в офисе.На одном листе у меня есть пользователи, которые вводят данные, которые необходимо выборочно копировать в некоторые другие рабочие листы, которые будут распечатаны для использования на производственной площадке. В настоящее время у меня проблема с форматированием моего листа "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)]:

Correct Ship sheet formatting

Факт.форматирование листа «Корабль» (параметры 1-3 при нормальной работе):

-Как отображается в Excel (отображается только страница 1-3 из 5): Incorrect Ship sheet formatting, as displayed

-Asраспечатывается в PDF с помощью предварительного просмотра в Excel: Incorrect Ship sheet formatting, as printed

1 Ответ

0 голосов
/ 16 февраля 2019

Причина многих соседних перерывов:
Возможно, они были введены во время интенсивного тестирования.

Справочная информация об ошибке:

  • Вы пытались сбросить все страницыразрывы сначала на Worksheet.Cells.PageBreak = xlPageBreakNone.
    Это не сработало, поэтому все ваши ручные тестовые перерывы все еще там.

  • Если вы определите PageSetup.Zoom = False и PageSetup.FitToPagesTall = 3,
    тогда дополнительные ручные разрывы страниц не вступают в силу.
    Ручные разрывы все еще можно установить, но они не эффективны и не видны.


Решение 1: Если ...

  • , то подгонка области печати к ширине страницы в целом приемлема
  • любая из ваших страниц должна иметь *На 1032 * меньше считать строк, чем автоматическое масштабирование
  • , и ни одна из ваших страниц не должна иметь на больше строк, чем автоматическое масштабирование

... затем установитеВаши горизонтальные разрывы страниц выполняются следующим образом:

  1. Сначала сбросьте все разрывы страниц на Worksheet.ResetAllPageBreaks

  2. Затем определитеавтоматическое разбиение вашей страницы на
    PageSetup.FitToPagesWide = 1
    Pagesetup.FitToPagesTall = False
    Не устанавливать масштаб.Он установлен на False указанными выше линиями.

  3. Размещайте горизонтальный разрыв страницы вручную в конце каждой страницы, который должен содержать меньше строк, чем устанавливается автоматически.Сделайте это сверху вниз.


Решение 2: Если на любой из ваших страниц требуется больше строк , чем указано выше, сделайте это следующим образом:

  1. Сначала сбросьте все разрывы страниц с помощью Worksheet.ResetAllPageBreaks
  2. Определите соответствующий уровень масштабирования, подходящий для страницы с множеством строк, например
    PageSetup.Zoom = 80
    PageSetup.FitToPagesWide = False
    PageSetup.FitToPagesTall = False
  3. Размещайте ручные горизонтальные разрывы страниц, чтобы при необходимости сокращать страницы.Делайте это с начала и до конца документа.

Установка горизонтального разрыва страницы вручную может быть выполнена одним из следующих способов:

  • Worksheet.HPageBreaks.Add Before:=ws.Rows(10)
  • Worksheet.Rows(10).PageBreak = xlPageBreakManual

Первый метод на быстрее , чем второй.


Worksheet.HPageBreaks.Count покажет числогоризонтальных разрывов страниц в области печати, включая автоматические разрывы.Следующие не будут "конвертировать" первый автоматический разрыв страницы.Он просто перемещает первый ручной разрыв, если есть хотя бы один:

  • Set Worksheet.HPageBreaks(1).Location = ws.Rows(20)
...