Excel VBA печать групп вкладок в PDF
Чем сложнее отчет в экселе, и чем больше вкладок, тем утомительнее процесс печати. Особенно если надо распечать несколько вкладок из списка в определенном порядке. Каждый раз выбирать одну за другой вкладки в интерфейсе, когда их счет идет на десятки, — утомительно. Однако небольшой vba скрипт поможет решить проблему печати группы вкладок из Экселя.
Скрипт решает следующую задачу — выбирает все листы в открытом эксель файле с именами согласно заданному списку и публикует в виде pdf файла с заданным именем.
Excel VBA код для экспорта вкладок в PDF
Private Sub CommandButton_Click()
Dim wksAllSheetsT3 As Variant
Dim wksSheet1 As Worksheet
Dim strFilename As String, strFilepath As String
Set wksSheet1 = Sheets("Sheet 1")'надо указать имя первой вкладки из списка
wksAllSheetsT3 = Array( _
"Sheet 1", "Sheet 2", "Sheet 3", " Sheet 4" _
)'Список вкладок через запятую
Sheets(wksAllSheetsT3).Select 'Выбираем все вкладки из списка
'И публикуем их в виде pdf документа
wksSheet1.ExportAsFixedFormat _
Type:=xlTypePDF, _
Filename:="C:\PDF_reports\test.pdf", _
Quality:=xlQualityStandard, _
IncludeDocProperties:=True, _
IgnorePrintAreas:=False, _
OpenAfterPublish:=True
wksSheet1.Select 'сбрасываем выборку.
End Sub
Источником вдохновения послужила публикация:
https://danwagner.co/how-do-i-save-multiple-sheets-as-a-single-pdf/
Исходный код я укоротил, и добавил комментарии. Как видно из названия функции — она повешена на кнопку. Не большая форма с кнопок может сильно сократить затраты времени необходимые для печати вкладок.
Одно замечание, порядок вкладок в списке на самом деле не имеет никакого принципиального значения. Вкладки будут выведены на печать в той последовательности в которой они существуют в excel файле.
Эксель печатаем вкладки по одной VBA
Если хоте вывести страницы на печать в том порядке, что задан списком, стоит испол цикл. Иллюстрирует процесс следующий код. Наши две команды тут завернуты в цикл. А чтобы файлы в процессе экспорта не перепутались — пронумеруем каждый файл снабдим именем вкладки.
'Сохраняем вкладки по одной в цикле
For i = 0 To 27
'обновляем выбор первой вкладки
Set wksSheet1 = Sheets(wksAllSheets(i))
'Выводим вкладки по одной, заодно нумеруем их
wksSheet1.ExportAsFixedFormat _
Type:=xlTypePDF, _
Filename:="C:\PDF_report\" & i & "_" & wksAllSheets(i) & ".pdf", _
Quality:=xlQualityStandard, _
IncludeDocProperties:=True, _
IgnorePrintAreas:=False, _
OpenAfterPublish:=True
Next i
После можно, с помощью бесплатной программы PDF Split&Merge, соединить все выходные файлы в один.
Good work here!
All thanks to your brilliant realization of this issue!
Same topic on overflow.com was much less helpful, if in compare with your post.
Спасибо, интересная статья.
«После можно, с помощью бесплатной программы PDF Split&Merge, соединить все выходные файлы в один» — а можно прям в коде использовать API например Acrobat’а — и будет вообще красота.
По аналогии с таким кодом из автокада (тут ведь не принципиально использовать путь напечатанного файла из акада или «Filename» из приведенного кода):
For i = 2 To n
Layout.SetWindowToPlot BL_Corner, TR_Corner
Layout.PlotType = acWindow ‘Печатаем окно
.Regen acAllViewports ‘Регенирируем вид
.Plot.PlotToDevice ‘Непосредственно печать
Set objPdf = CreateObject(«Scripting.FileSystemObject»)
Set objNewPdf = objPdf.GetFile(pdfWayDefault)
objPDF2.Open (pdfWayDefault) ‘Только что напечатанный файл
numPages1 = objPDF1.GetNumPages()
If objPDF1.InsertPages(numPages1 — 1, objPDF2, 0, 1, True) = False Then
MsgBox («Не получилось вставить страницы. Закройте акробат и повторите. «)
End If
objPDF2.Close
BL_Corner(0) = BL_Corner(0) + 210#
TR_Corner(0) = TR_Corner(0) + 210#
Next i
If objPDF1.Save(PDSaveFull, pdfWayOnly & «\» + shifr + «.pdf») = False Then
MsgBox («Не получилось сохранить измененный документ!»)
End If