С помощью следующего кода вы можете вставить несколько примеров диапазонов в виде скриншотов на лист назначения, каждый с разрывом страницы между ними.
Я оставил одну строку пустой до и после каждого снимка экрана (причина: когда границафигуры помещается непосредственно на разрыв страницы, граница может быть напечатана и на соседней странице).
Пожалуйста, измените уровень масштабирования в последней строке кода, чтобы получить даже самый большой скриншот, напечатанный на 1 странице.(например, 54%).Если вы хотите рассчитать его автоматически, см. Вторую часть кода этого ответа.
Private Sub CollectScreenshots()
Dim wsSource As Worksheet, wsDestination As Worksheet
Dim rngExampleRanges As Range
Dim rngCopy As Range
Dim rowPaste As Long
Dim shpScreenshot As Shape
Dim dlg As Dialog
Application.DisplayStatusBar = True
Set wsSource = Sheets("BlockChart")
Set rngExampleRanges = wsSource.Range("A1:N51, A52:B53, C60:E99")
Set wsDestination = Sheets("Screenshots")
' Copy all ranges as screenshot into destination worksheet:
rowPaste = 1
With wsDestination
.ResetAllPageBreaks
For Each rngCopy In rngExampleRanges.Areas
rngCopy.CopyPicture Appearance:=xlScreen, Format:=xlPicture
DoEvents
If rowPaste > 1 Then .HPageBreaks.Add Before:=.Rows(rowPaste)
.Paste Destination:=.Cells(rowPaste + 1, 1), Link:=False
DoEvents
Set shpScreenshot = .Shapes(.Shapes.Count)
rowPaste = shpScreenshot.BottomRightCell.Row + 1
Next rngCopy
End With
Application.CutCopyMode = False
' set appropriate zoom level
wsDestination.PageSetup.Zoom = 54
End Sub
Автоматический уровень масштабирования
Если вы хотите, чтобы Excel рассчитал оптимальный уровень масштабирования,это немного сложнее.
Если у вас есть диапазон ячеек, например, A1: N51, который должен быть напечатан на 1 странице, тогда вы можете установить параметры диалогового окна страницы следующим образом:
- определить область печати как A1: N51
- установить масштабирование на ширину 1 страницы и высоту 1 страницы
- Затем вы можете визуально увидеть рассчитанный уровень масштабирования в диалоговом окне настройки страницы.
К сожалению, вы не можете прочитать этот уровень масштабирования напрямую через VBA, так как Worksheet.PageSetup.Zoom
в этом случае возвращает только False
.Если вы призываете Excel использовать уровень масштабирования, например, установив FitToPagesWide
на False
, Excel рассчитывает новый уровень масштабирования.
Чтобы прочитать рассчитанный уровень масштабирования, необходимо отправить сочетание клавиш надиалог настройки страницы.Чтобы получить правильное сочетание клавиш для этого, проверьте в диалоговом окне настройки страницы, какое сочетание клавиш используется для уровня масштабирования.В моей немецкой версии Excel это Alt + V .
Затем замените последнюю строку кода сверху следующим образом:
' get cell dimensions of the largest screenshot:
Dim maxVerticalCells, maxHorizontalCells
For Each shpScreenshot In wsDestination.Shapes
maxVerticalCells = Application.WorksheetFunction.Max( _
maxVerticalCells, _
shpScreenshot.BottomRightCell.Row - shpScreenshot.TopLeftCell.Row + 1)
maxHorizontalCells = Application.WorksheetFunction.Max( _
maxHorizontalCells, _
shpScreenshot.BottomRightCell.Column - shpScreenshot.TopLeftCell.Column + 1)
Next shpScreenshot
' set appropriate zoom level
With wsDestination
' Simulate a print area with required dimensions to get it printed to 1 page
.PageSetup.Zoom = False
.PageSetup.FitToPagesWide = 1
.PageSetup.FitToPagesTall = 1
.PageSetup.PrintArea = _
.Range(.Cells(1, 1), .Cells(maxVerticalCells, maxHorizontalCells)).Address
' change the page setup to automatic and keep previous zoom level
' by sending keys to page setup dialog
.Activate
Dim strKeys As String
strKeys = "P" ' key "P" for first tab in that dialog
strKeys = strKeys & "%V" ' key <Alt>+<V> for automatic zoom (German, might be %A in other countries)
strKeys = strKeys & "~" ' key <Enter>
SendKeys strKeys ' send keys to following dialog
Application.Dialogs(xlDialogPageSetup).Show
Dim myZoomlevel As Double
myZoomlevel = .PageSetup.Zoom
' Reset print area, reset automatic page adaption, use previous zoom level
.PageSetup.PrintArea = ""
.PageSetup.FitToPagesWide = False
.PageSetup.FitToPagesTall = False
.PageSetup.Zoom = myZoomlevel
End With