VBA — Как настроить область печати для нескольких страниц на одном листе?

#excel #vba #printing

Вопрос:

Я использую этот код

 Sub print_area()

Dim ws As Worksheet

For Each ws In ActiveWorkbook.Worksheets

With ws.PageSetup

.PrintTitleColumns = "$A:$E"
.PrintArea = ws.Range("A128").Value
.CenterHorizontally = True

End With

Next
End Sub

 

Range("A128").Value имеет значение: $F$1:$AF$125,$AG$1:$BE$125,$BF$1:$CD$125,$CE$1:$DA$125,$DB$1:$DX$125

области печати заданы неправильно (области близки к заданному диапазону, но не так, как хотелось бы), какие еще параметры мне нужно установить, чтобы это работало правильно?

Красная стрелка указывает, где должна находиться область печати

введите описание изображения здесь

Комментарии:

1. Возможно , вам захочется перейти Range("A128").Value на ws.Range("A128").Value , так как вы просматриваете рабочие листы.

2. Внес это изменение, все еще не работает :/. Спасибо

Ответ №1:

Как правило, Excel автоматически устанавливает разрывы страниц для печати в зависимости от размера бумаги, масштаба, заданного количества листов по ширине и высоте, ориентации страницы и других параметров. Вы можете использовать объекты VPageBreak и HPageBreak в сочетании с рядом .PageSetup свойств для ручной подгонки разрывов страниц. Обратите внимание, что вы не можете установить разрывы страниц с .PrintArea помощью свойства (см. Ниже в коде, почему). В следующем коде я устанавливаю разрывы страниц после ячеек «AF1», «BE1», «CD1», «DA1», «DX1»:

 Sub print_area()
    Dim ws As Worksheet
    
    For Each ws In ActiveWorkbook.Worksheets
        With ws.PageSetup
            .PrintTitleColumns = "$A:$E"
            .PrintArea = "$F$1:$AF$125,$AG$1:$BE$125,$BF$1:$CD$125,$CE$1:$DA$125,$DB$1:$DX$125" ' there will be one area between the upper left and lower right cells
            Debug.Print .PrintArea  ' check the final .PrintArea; prints $F$1:$DX$125
            .Zoom = False
            .Orientation = xlLandscape
            .FitToPagesWide = False 'it's Auto
            .FitToPagesTall = 1
            .CenterHorizontally = True
            ws.ResetAllPageBreaks
            breaks = Array("AF1", "BE1", "CD1", "DA1", "DX1")   'zero-based array
            For i = 1 To UBound(breaks)
                ws.VPageBreaks.Add Before:=ws.Range(breaks(i - 1)).Offset(, 1)
            Next
        End With
    Next
End Sub
 

Пожалуйста, обратите внимание, что в ответ на ваши действия по разбиению на страницы Excel может
(и обычно делает это) изменить саму разбивку на страницы

введите описание изображения здесь

Комментарии:

1. Спасибо. Я попробовал ваш код, он не сработал. Знаете ли вы другой способ решения этой проблемы?

2. После долгого времени я, наконец, понял ваш код. Спасибо