Сохранение в PDF книги Excel, группы листов, одного листа или отдельного диапазона с помощью кода VBA. Метод ExportAsFixedFormat. Примеры экспорта.
Метод ExportAsFixedFormat
Метод ExportAsFixedFormat сохраняет рабочую книгу Excel или выбранную группу листов этой книги в один PDF-файл. Чтобы экспортировать каждый лист в отдельный файл, необходимо применить метод ExportAsFixedFormat к каждому сохраняемому листу.
Синтаксис
Expression.ExportAsFixedFormat (Type, FileName, Quality, IncludeDocProperties, IgnorePrintAreas, From, To, OpenAfterPublish, FixedFormatExtClassPtr) |
Expression – это выражение, представляющее объект Workbook, Worksheet или Range.
Параметры
Единственный обязательный параметр – Type, остальные можно не указывать – в этом случае будут применены значения по умолчанию.
Параметр | Описание |
---|---|
Type | Задает формат файла для экспорта книги или листа: xlTypePDF(0) – сохранение в файл PDF; xlTypeXPS(1) – сохранение в файл XPS*. |
FileName | Задает имя файла. При указании полного пути, файл будет сохранен в указанную папку, при указании только имени – в папку по умолчанию (в Excel 2016 – «Документы»). Если имя не задано (по умолчанию), файл будет сохранен с именем экспортируемой книги. |
Quality | Задает качество сохраняемых электронных таблиц: xlQualityMinimum(1) – минимальное качество; xlQualityStandard(0) – стандартное качество (по умолчанию). |
IncludeDocProperties | Включение свойств документа Excel в PDF: True(1) – включить; False(0) – не включать; мне не удалось обнаружить разницу и значение по умолчанию. |
IgnorePrintAreas | Указывает VBA, следует ли игнорировать области печати, заданные на листах файла Excel: True(1) – игнорировать области печати; False(0) – не игнорировать области печати (по умолчанию). |
From** | Задает номер листа книги Excel, с которого начинается экспорт. По умолчанию сохранение в PDF начинается с первого листа книги. |
To** | Задает номер листа книги Excel, на котором заканчивается экспорт. По умолчанию сохранение в PDF заканчивается на последнем листе книги. |
OpenAfterPublish | Указывает VBA на необходимость открыть созданный файл PDF средством просмотра: True(1) – открыть файл PDF для просмотра; False(0) – не открывать файл PDF для просмотра (по умолчанию). |
FixedFormatExtClassPtr | Указатель на класс FixedFormatExt (игнорируем этот параметр). |
* XPS – это редко использующийся фиксированный формат файлов, разработанный Microsoft, который похож на PDF, но основан на языке XML.
** Применимо только к книге (Workbook.ExportAsFixedFormat), при экспорте листа (Worksheet.ExportAsFixedFormat) указание параметров From и/или To приведет к ошибке.
Сохранение в PDF книги Excel
Экспорт всей книги
Sub Primer1() ThisWorkbook.ExportAsFixedFormat Type:=xlTypePDF, Filename:=«C:Testfile1.pdf», OpenAfterPublish:=True End Sub |
Если вы указываете путь к файлу, он должен существовать, иначе VBA сохранит файл с именем и в папку по умолчанию («ИмяКниги.pdf» в папку «Документы»).
Экспорт части книги
Этот способ позволяет сохранить в PDF группу листов, расположенных подряд:
Sub Primer2() ThisWorkbook.ExportAsFixedFormat Type:=xlTypePDF, Filename:=«C:Testfile2.pdf», _ From:=2, To:=4, OpenAfterPublish:=True End Sub |
Сохранение в PDF рабочих листов
Экспорт одного листа
Sub Primer3() ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=«C:Testfile3.pdf», OpenAfterPublish:=True End Sub |
Экспорт диапазона
Sub Primer2() Лист4.Range(«A1:F6»).ExportAsFixedFormat Type:=xlTypePDF, Filename:=«C:Testfile4.pdf», OpenAfterPublish:=True End Sub |
Если экспортируемый диапазон расположен на активном листе, имя листа указывать не обязательно.
Экспорт группы листов
Этот способ удобен тем, что экспортировать в PDF можно листы, расположенные не подряд:
Sub Primer5() Sheets(Array(«Лист2», «Лист3», «Лист5»)).Select Selection.ExportAsFixedFormat Type:=xlTypePDF, Filename:=«C:Testfile5.pdf», OpenAfterPublish:=True End Sub |
Формулировка задачи:
Добрый день!
На компьютере установлен пакет программ adobe, и в списке устройств имеется принтер adobe pdf, он установлен как принтер по умолчанию.
Имеется код макроса:
Создается .pdf Файл, но не открывается ни одной из подходящих для чтения pdf программ.
Если использовать следующий код:
,
то появляется диалоговое окно сохранения файла, и при указании пути назначения и имени файла, формируется корректный .pdf-файл.
В чём разница между двумя данными методами, и как обойти проблему формирования битого файла при использовании первого варианта макроса?
Код к задаче: «Печать pdf из excel-листа»
textual
Sub Макрос2() Лист1.PrintOut Copies:=1, ActivePrinter:="Microsoft Print to PDF (Ne02:)", _ PrintToFile:=True, PrToFileName:="D:UsersANTON-SFDesktopTEST.PDF" End Sub
Полезно ли:
8 голосов , оценка 4.000 из 5
daserdj 0 / 0 / 0 Регистрация: 13.10.2016 Сообщений: 2 |
||||||||
1 |
||||||||
06.11.2016, 16:11. Показов 12318. Ответов 3 Метки нет (Все метки)
Добрый день!
Создается .pdf Файл, но не открывается ни одной из подходящих для чтения pdf программ. Если использовать следующий код:
,
0 |
15136 / 6410 / 1730 Регистрация: 24.09.2011 Сообщений: 9,999 |
|
07.11.2016, 00:09 |
2 |
daserdj, Офис 2007 и более новые имеют встроенные средства для сохранения в PDF. Запишите макрорекордером команду Файл — Сохранить как — тип файла: PDF, Параметры, опубликовать: выделенные листы, ОК.
1 |
0 / 0 / 0 Регистрация: 13.10.2016 Сообщений: 2 |
|
07.11.2016, 14:24 [ТС] |
3 |
Казанский, спасибо за ответ!
0 |
anton-sf 123 / 59 / 14 Регистрация: 29.03.2015 Сообщений: 265 |
||||||||
08.11.2016, 10:46 |
4 |
|||||||
Из метода, предложенного Казанский, получается макрос, например у меня такой
Из этого макроса видно название PDF принтера — его и надо использовать:
1 |
Return to VBA Code Examples
This tutorial will demonstrate how to save / print to a PDF in Excel VBA.
Print to PDF
This simple procedure will print the ActiveSheet to a PDF.
Sub SimplePrintToPDF()
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:="demo.pdf", Quality:=xlQualityStandard, _
IncludeDocProperties:=False, IgnorePrintAreas:=False, OpenAfterPublish:=True
End Sub
I’ve also created a function with error handling, etc. that will print the ActiveSheet to a PDF:
Sub PrintPDF()
Call Save_PDF
End Sub
Function Save_PDF() As Boolean ' Copies sheets into new PDF file for e-mailing
Dim Thissheet As String, ThisFile As String, PathName As String
Dim SvAs As String
Application.ScreenUpdating = False
' Get File Save Name
Thissheet = ActiveSheet.Name
ThisFile = ActiveWorkbook.Name
PathName = ActiveWorkbook.Path
SvAs = PathName & "" & Thissheet & ".pdf"
'Set Print Quality
On Error Resume Next
ActiveSheet.PageSetup.PrintQuality = 600
Err.Clear
On Error GoTo 0
' Instruct user how to send
On Error GoTo RefLibError
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=SvAs, Quality:=xlQualityStandard, IncludeDocProperties:=False, IgnorePrintAreas:=False, OpenAfterPublish:=True
On Error GoTo 0
SaveOnly:
MsgBox "A copy of this sheet has been successfully saved as a .pdf file: " & vbCrLf & vbCrLf & SvAs & _
"Review the .pdf document. If the document does NOT look good, adjust your printing parameters, and try again."
Save_PDF = True
GoTo EndMacro
RefLibError:
MsgBox "Unable to save as PDF. Reference library not found."
Save_PDF = False
EndMacro:
End Function
The function returns TRUE or FALSE if the print to PDF was successful or not.
Save and Email PDF Function
This function will save the ActiveSheet as a PDF and (optionally) attach the PDF to an email (assuming you have Outlook installed):
Sub Test_Save_PDF()
Call Send_PDF("SendEmail")
End Sub
Function Send_PDF(Optional action As String = "SaveOnly") As Boolean ' Copies sheets into new PDF file for e-mailing
Dim Thissheet As String, ThisFile As String, PathName As String
Dim SvAs As String
Application.ScreenUpdating = False
' Get File Save Name
Thissheet = ActiveSheet.Name
ThisFile = ActiveWorkbook.Name
PathName = ActiveWorkbook.Path
SvAs = PathName & "" & Thissheet & ".pdf"
'Set Print Quality
On Error Resume Next
ActiveSheet.PageSetup.PrintQuality = 600
Err.Clear
On Error GoTo 0
' Instruct user how to send
On Error GoTo RefLibError
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=SvAs, Quality:=xlQualityStandard, IncludeDocProperties:=False, IgnorePrintAreas:=False, OpenAfterPublish:=True
On Error GoTo 0
' Send Email
If action = "SendEmail" Then
On Error GoTo SaveOnly
Set olApp = CreateObject("Outlook.Application")
Set olEmail = olApp.CreateItem(olMailItem)
With olEmail
.Subject = Thissheet & ".pdf"
.Attachments.Add SvAs
.Display
End With
On Error GoTo 0
GoTo EndMacro
End If
SaveOnly:
MsgBox "A copy of this sheet has been successfully saved as a .pdf file: " & vbCrLf & vbCrLf & SvAs & _
"Review the .pdf document. If the document does NOT look good, adjust your printing parameters, and try again."
Send_PDF = True
GoTo EndMacro
RefLibError:
MsgBox "Unable to save as PDF. Reference library not found."
Send_PDF = False
EndMacro:
End Function
VBA Coding Made Easy
Stop searching for VBA code online. Learn more about AutoMacro — A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users!
Learn More!
Макрос печатать листы в пдф, как сохранять название? |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
pinguindell Пользователь Сообщений: 200 |
#1 03.08.2016 15:28:47 Добрый день уважаемые знатоки VBA Есть задача — необходимо при нажатии на кнопку Печать на листе, чтобы макрос отправлял на печать pdf файлы, ссылки на которые размещены в столбце А.
Есть ли возможность отправлять файлы на печать не открывая сами файлы в Adobe ? Спасибо за ответы P.S. гиперссылки в файле битые, т.к. у каждого на компьютере будет собственный путь. Прикрепленные файлы
|
||
JeyCi Пользователь Сообщений: 3357 |
#2 04.08.2016 07:13:32
Нет чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок — обратитесь к собеседнику на ВЫ — ответ на ваш вопрос получите — а остальное вас не касается (п.п.п. на форумах) |
||
marchenkoan Пользователь Сообщений: 59 |
#3 04.08.2016 07:47:19 Попробуйте вот так:
|
||
pinguindell Пользователь Сообщений: 200 |
#4 05.08.2016 07:22:56 marchenkoan,спасибо большое! практически то что нужно, но только мне пришлось немного адаптировать Ваш код под свой. Вот, может кому то и пригодиться: Следующий код повесил на кнопку на листе, чтобы он выделял область ячеек с гиперссылками на файлы:
затем сам код, отвечающий за печать файлов pdf по гиперссылкам:
ну и еще один код, который я повесил на событие закрытия книги, он позволяет при закрытии excel файла, закрыть все окна Adobe Reader, которое остались на панели задач.
Изменено: pinguindell — 05.08.2016 07:23:36 |
||||||
pinguindell Пользователь Сообщений: 200 |
#5 24.08.2016 12:47:18 Уважаемые знатоки VBA, в очередной раз прошу Вашей помощи, в чем может быть проблема. Макрос работает и все хорошо, но почему то печать происходит не по порядку расположения файлов в диапазоне — на печать должны идти файлы в следующей последовательности: Часть 1, Часть 2, Часть 3, Часть 4, а они идут как Часть1, Часть 4, Часть 3, Часть2 Я немного изменил код и теперь он выглядит так:
В чем может быть проблема ?. Прикрепленные файлы
Изменено: pinguindell — 25.08.2016 12:09:05 |
||
Уважаемые форумчане, помогите пожалуйста с решением, мучаюсь не одну неделю … |
|
JeyCi Пользователь Сообщений: 3357 |
#7 04.09.2016 08:25:19 а жёстко задать счётчик не пробовали?
и в sh.Cells(i,1) — обращайтесь к гиперссылке… были примеры на форуме… и здесь: Как получить адрес гиперссылки из ячейки p.s. ссылок в файле нет, тестить на принтере в любом случае не хочу… просто версия Изменено: JeyCi — 04.09.2016 08:28:33 чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок — обратитесь к собеседнику на ВЫ — ответ на ваш вопрос получите — а остальное вас не касается (п.п.п. на форумах) |
||
pinguindell Пользователь Сообщений: 200 |
#8 05.09.2016 15:37:30 JeyCi,спасибо за совет. Попробовал сделать так как Вы сказали, получилось следующее (код ниже), но почему то код выдает ошибку Object required
Прикрепленные файлы
|
||
kuklp Пользователь Сообщений: 14868 E-mail и реквизиты в профиле. |
#9 05.09.2016 16:22:20
Так да не так. Что Вы скармливаете функции? Значения счетчика, i. А ей надобен: ByVal rCell As Range. Ячейка то бишь. Вот она и матерится, подай ей объект анонсированный в оглавлении. Типа: pdfLINK = Get_Hyperlink_Address(Cells(i)). И еще. Что по вашему у Вас делает строка:
, да и вообще всЯ эта переменная? Я сам — дурнее всякого примера! … |
||||
pinguindell Пользователь Сообщений: 200 |
#10 06.09.2016 12:24:06 Уважаемые форумчане, спасибо за Ваши советы, переписал код следующим образом, и счетчик поставил и удалил не нужное, но печать все равно идет не последовательно.
В чем теперь может быть проблема ? Прикрепленные файлы
|
||
ZVI Пользователь Сообщений: 4328 |
#11 06.09.2016 13:02:33 В коде сообщения #1 в конце используйте такой вариант
|
||
ZVI Пользователь Сообщений: 4328 |
Но, по сути, это то же самое, что делает ShellExecute, то есть проблема с очередностью останется. |
ZVI,попробовал использовать Ваш вариант, но почему то на печать отправляется только первый документ в списке. |
|
Юрий М Модератор Сообщений: 60585 Контакты см. в профиле |
#14 06.09.2016 13:30:57
А это критично? |
||
Jack Famous Пользователь Сообщений: 10852 OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome |
Юрий М, доброго дня! Слежу за темой…и в моём случае это было бы критично, т.к., например, по таблице печати может быть составлен реестр документов. В таком случае ,естественно, хотелось бы отправить на печать и потом просто положить в папку с реестром ,зная, что там всё в том же порядке. Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄ |
Юрий М Модератор Сообщений: 60585 Контакты см. в профиле |
Смысл понятен, но, как мне кажется, главная задача — именно вывод на печать — решена )) В крайнем случае не составит большого труда разложить листы в нужной последовательности )) |
Jack Famous Пользователь Сообщений: 10852 OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome |
Юрий М, а я (так как не силён в VBA): Изменено: Jack Famous — 06.09.2016 15:08:06 Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄ |
JeyCi Пользователь Сообщений: 3357 |
#18 06.09.2016 15:21:23
а что насчёт этого?
я тоже думаю, что дело в этом… т.е. в #10 вы циклом запускаете всё поочерёдно по адресам из ячеек в нужной последовательности… Изменено: JeyCi — 06.09.2016 15:48:33 чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок — обратитесь к собеседнику на ВЫ — ответ на ваш вопрос получите — а остальное вас не касается (п.п.п. на форумах) |
||||
ZVI Пользователь Сообщений: 4328 |
#19 06.09.2016 19:24:22 JeyCi права насчет паузы внутри цикла. Подберите таймаут в коде ниже:
Изменено: ZVI — 06.09.2016 19:26:11 |
||
ZVI, спасибо большое. Единственный вопрос — как для Const TIMEOUT = 2 ‘<— Пауза в секундах после распечатки документа присваивать значение из ячейки ? К примеру О2 текущего листа ? |
|
JayBhagavan Пользователь Сообщений: 11833 ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64 |
#21 07.09.2016 13:19:52 pinguindell, замените:
на:
<#0> |
||||
pinguindell Пользователь Сообщений: 200 |
#22 07.09.2016 13:38:45 JayBhagavan, изменил код на предложенный
ошибка 1004 Run time error 1004 Application defined or object defined error |
||
JayBhagavan Пользователь Сообщений: 11833 ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64 |
pinguindell, не видя файла и что находится в О1 — ничем не могу помочь. <#0> |
JayBhagavan,файл во вложении папку Темр нужно поместить на диск С Прикрепленные файлы
|
|
JayBhagavan Пользователь Сообщений: 11833 ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64 |
#25 07.09.2016 14:02:34
<#0> |
|
ZVI Пользователь Сообщений: 4328 |
У JayBhagavan в сообщении #25 правильно все написано. |
Уважаемые форумчание, спасибо огромное каждому из Вас. Думаю тема актуальная и поможет многим значительно автоматизировать, ускорить и упростить работу. |
|
PerfectVam Пользователь Сообщений: 413 |
#28 21.08.2017 11:44:37 Уважаемые модераторы! У меня тоже возникла проблема с порядком вывода на печать. Насколько я понял, очередь печати — не совсем очередь. Реализована она как стек. Из-за этого, задание, попавшее на печать раньше, но во время обработки другого, может быть обработано вообще последним!!! Попытавшись сделать это самостоятельно, нашел некий код для 32-разрядной системы. Попытался исправить под 64-рязрядную. То ли криво модернизировал, то ли код вообще неподходящий, но попытка запуска вообще снесла EXCEL. Вот что у меня получилось:
Мне, конечно, интересно самому доковырять, но вопрос времени сейчас стоит остренько. Буду благодарен как за комментарии: «Что Ади сделал неправильно», так и за любые подсказки/намеки/готовые решения проблемы отслеживания состояния принтера, позволяющие организовать «зрячее» ожидание запуска в печать следующего файла. Следствие из третьего закона Чизхолма: |
||
PerfectVam Пользователь Сообщений: 413 |
#29 22.08.2017 19:53:03 Ну вот, удалось обойтись обходным маневром без огорода API. Хоть и видел я советы, что бояться этого зверья не стоит, но не освоил еще… Я сделал печать содержимого столбца C. Легко переделать под любое другое расположение данных.
«Заплатка», конечно, но в умелых руках проблему решает… Прикрепленные файлы
Следствие из третьего закона Чизхолма: |
||
ZVI Пользователь Сообщений: 4328 |
#30 22.08.2017 21:52:12
Если установлена профессиональная версия Acrobat, и такой тест не вызывает ошибки:
или, что в принципе одно и тоже, установлена ссылка: VBE — Tools — Refereces — ‘Acrobat’ или ‘Adobe Acrobat ##.# Type Library’ (XX.X — номер версии) — OK,
Приведенный выше код распечатает документ PDF аналогично тому, как это может быть сделано из интерфейса Adobe. А проблема спуллинга и очередности распечатки на сетевом принтере — это действительно отдельная задача. Изменено: ZVI — 22.08.2017 22:22:17 |
||||||
Since Excel 2010, it has been possible to save Excel as PDF. The PDF format was then and continues to be, one of the most common file formats for distributing documents.
The code examples below provide the VBA macros to automate the creation of PDFs from Excel using the ExportAsFixedFormat method. This means you do not require a PDF printer installed, as Excel can print directly to a PDF document.
The example codes can be used independently or as part of a larger automation process. For example, check out this post to see an example of how to loop through a list and print a PDF for each item: Create multiple PDFs based on a list
Rather than going from Excel to PDF, you might want to go the other way; from PDF to Excel. Check out these posts for possible solutions for that scenario:
- How to Import PDF Files into Excel with Power Query
- Get data from PDF into Excel
Download the example file: Click the link below to download the example file used for this post:
Saving Excel workbooks, sheets, charts, and ranges as PDF
This section contains the base code to save Excel as PDF from different objects (workbooks, worksheets, ranges, and charts). From a VBA perspective, it is the ExportAsFilxedFormat method combined with the Type property set to xlTypePDF that creates a PDF.
Save active sheet as PDF
The following code saves the selected sheets as a single PDF.
Sub SaveActiveSheetsAsPDF()
'Create and assign variables
Dim saveLocation As String
saveLocation = "C:UsersmarksOneDriveDocumentsmyPDFFile.pdf"
'Save Active Sheet(s) as PDF
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, _
Filename:=saveLocation
End Sub
Save active workbook as PDF
Use the following macro to save all the visible sheets from a workbook.
Sub SaveActiveWorkbookAsPDF()
'Create and assign variables
Dim saveLocation As String
saveLocation = "C:UsersmarksOneDriveDocumentsmyPDFFile.pdf"
'Save active workbook as PDF
ActiveWorkbook.ExportAsFixedFormat Type:=xlTypePDF, _
Filename:=saveLocation
End Sub
Save selection as PDF
Sometimes, we only want to save a small part of a worksheet to a PDF. The following code prints only the selected cells.
Sub SaveSelectionAsPDF()
'Create and assign variables
Dim saveLocation As String
saveLocation = "C:UsersmarksOneDriveDocumentsmyPDFFile.pdf"
'Save selection as PDF
Selection.ExportAsFixedFormat Type:=xlTypePDF, _
Filename:=saveLocation
End Sub
Save a range as PDF
The macro below saves a specified range as a PDF.
Sub SaveRangeAsPDF()
'Create and assign variables
Dim saveLocation As String
Dim ws as Worksheet
Dim rng As Range
saveLocation = "C:UsersmarksOneDriveDocumentsmyPDFFile.pdf"
Set ws = Sheets("Sheet1")
Set rng = ws.Range("A1:H20")
'Save a range as PDF
rng.ExportAsFixedFormat Type:=xlTypePDF, _
Filename:=saveLocation
End Sub
Save a chart as PDF
The VBA code below saves a specified chart as a PDF.
Sub SaveChartAsPDF()
'Create and assign variables
Dim saveLocation As String
Dim ws As Worksheet
Dim cht As Chart
saveLocation = "C:UsersmarksOneDriveDocumentsmyPDFFile.pdf"
Set ws = Sheets("Sheet1")
Set cht = ws.ChartObjects("Chart 1").Chart
'Save a chart as PDF
cht.ExportAsFixedFormat Type:=xlTypePDF, _
Filename:=saveLocation
End Sub
Rather than naming a specific chart, the macro could run based on the active chart. Change this:
Set cht = ws.ChartObjects("Chart 1").Chart
To this:
Set cht = ActiveChart
Adapting the code to your scenario
To adapt the code examples to your specific needs, you should adjust certain lines of code.
Change the save location
To save the file in the correct location, change this list of code:
saveLocation = "C:UsersmarksOneDriveDocumentsmyPDFFile.pdf"
If you would prefer the save location to be included in a cell, change the code to reference the sheet and cell containing the file path.
saveLocation = Sheets("Sheet1").Range("B2").Value
Change the worksheet
In this line of code, change the text “Sheet1” to the sheet name in your workbook.
Set ws = Sheets("Sheet1")
Change the range
The following line of codes references the range to be printed to PDF.
Set rng = ws.Range("A1:H20")
Change the chart
To print a chart to PDF, change the chart’s name in the following line of code.
Set cht = ws.ChartObjects("Chart 1").Chart
If you are unsure of the chart name, it is shown in the Name box when the chart is selected.
Notes for saving PDF documents
While the Filename property is optional, it is important to know where the file is saved.
- If the Filename property is not provided, the PDF saves in your default folder location using the Excel workbook’s name with the .pdf file extension.
- Where a file name is provided, but not a file path, the document saves in your default folder location with the name provided.
- When the .pdf file extension is not provided, the suffix is added automatically.
- If a PDF exists in the specified save location, the existing file is overwritten. Therefore, it may be necessary to include file handling procedures to prevent overwriting existing documents and handling errors.
- To save as an XPS document format, change xlTypePDF for xlTypeXPS.
Selecting specific worksheets before saving as PDF
If more than one worksheet is active, the PDF created includes all the active sheets. The following code selects multiple worksheets from an array before saving the PDF.
Sub SelectSheetsAndSaveAsPDF()
'Create and assign variables
Dim saveLocation As String
Dim sheetArray As Variant
saveLocation = "C:UsersmarksOneDriveDocumentsmyPDFFile.pdf"
sheetArray = Array("Sheet1", "Sheet2")
'Select specific sheets from workbook, the save all as PDF
Sheets(sheetArray).Select
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, _
Filename:=saveLocation
End Sub
In the code above, an array is used to select the specific sheets. Alternatively, the Split array function with a text string could provide a more dynamic solution. This method is covered here: VBA Arrays.
Looping and saving as separate PDFs
To save multiple PDFs quickly, we can use VBA to loop through sheets or charts and save each individually.
Loop through sheets
The following macro loops through each worksheet in the active workbook and saves each as its own PDF. Each PDF is saved in the same folder as the workbook, where each PDF’s name is based on the worksheet’s name.
Sub LoopSheetsSaveAsPDF()
'Create variables
Dim ws As Worksheet
'Loop through all worksheets and save as individual PDF in same folder
'as the Excel file
For Each ws In ActiveWorkbook.Worksheets
ws.ExportAsFixedFormat Type:=xlTypePDF, _
Filename:=ThisWorkbook.Path & "/" & ws.Name & ".pdf"
Next
End Sub
Loop through selected sheets
The following macro loops through only the selected worksheets in the active workbook and saves each as its own PDF.
Sub LoopSelectedSheetsSaveAsPDF()
'Create variables
Dim ws As Worksheet
Dim sheetArray As Variant
'Capture the selected sheets
Set sheetArray = ActiveWindow.SelectedSheets
'Loop through each selected worksheet
For Each ws In sheetArray
ws.Select
ws.ExportAsFixedFormat Type:=xlTypePDF, _
Filename:=ThisWorkbook.Path & "/" & ws.Name & ".pdf"
Next ws
'Reselect the selected sheets
sheetArray.Select
End Sub
Loop through charts
The following code loops through each chart on the active sheet and saves each as a separate PDF.
Sub LoopChartsSaveAsPDF()
'Create and assign variables
Dim chtObj As ChartObject
Dim ws As Worksheet
Set ws = ActiveSheet
'Loop through all charts and save as individual PDF in same folder
'as the Excel file
For Each chtObj In ws.ChartObjects
chtObj.Chart.ExportAsFixedFormat Type:=xlTypePDF, _
Filename:=ThisWorkbook.Path & "/" & chtObj.Name & ".pdf"
Next chtObj
End Sub
Other PDF print options
When using ExportAsFixedFormat, there are other optional settings available:
'Open the document after it is saved - options are True / False
OpenAfterPublish:=False
'Include the Excel document properties into the PDF - options are True / False
IncludeDocProperties:=True
'Does the created PDF adhere to the Print Areas already set in the
'worksheet - options are True / False
IgnorePrintAreas:=False
'Set the output quality of the created document - options are
'xlQualityMinimum / xlQualityStandard
Quality:=xlQualityStandard
'The page to start printing. If excluded, will start from the first page
From:=1
'The page to print to. If excluded, will go to the last page
To:=2
VBA Save to PDF Example using all the options
The code below demonstrates how to use all the options within a single macro. These options can be flexed to meet your requirements.
Sub SaveAsPDFOptions()
Dim saveLocation As String
saveLocation = "C:UsersmarksDocumentsmyPDFFile.pdf"
'Example using all the options
ActiveSheet.ExportAsFixedFormat _
Type:=xlTypePDF, _
Filename:=saveLocation, _
OpenAfterPublish:=False, _
IncludeDocProperties:=True, _
IgnorePrintAreas:=False, _
Quality:=xlQualityStandard, _
From:=1, To:=2
End Sub
Other fixed formats available (xlTypeXPS)
The Type property can also create XPS documents when it is set to xlTypeXPS rather than xlTypePDF. XPS is Microsoft’s fixed file format; it is similar to PDF but based on the XML language. It is rarely used in the real world but is an option if required.
Conclusion
Learning how to save Excel as PDF is a good time investment. Each of these code snippets on its own is useful. However, the code examples above can be used in other automation to create even more time-saving.
Related posts:
- Excel – Create multiple PDFs based on a list
- Loop through selected sheets with VBA
- How to loop through each item in Data Validation list with VBA
About the author
Hey, I’m Mark, and I run Excel Off The Grid.
My parents tell me that at the age of 7 I declared I was going to become a qualified accountant. I was either psychic or had no imagination, as that is exactly what happened. However, it wasn’t until I was 35 that my journey really began.
In 2015, I started a new job, for which I was regularly working after 10pm. As a result, I rarely saw my children during the week. So, I started searching for the secrets to automating Excel. I discovered that by building a small number of simple tools, I could combine them together in different ways to automate nearly all my regular tasks. This meant I could work less hours (and I got pay raises!). Today, I teach these techniques to other professionals in our training program so they too can spend less time at work (and more time with their children and doing the things they love).
Do you need help adapting this post to your needs?
I’m guessing the examples in this post don’t exactly match your situation. We all use Excel differently, so it’s impossible to write a post that will meet everybody’s needs. By taking the time to understand the techniques and principles in this post (and elsewhere on this site), you should be able to adapt it to your needs.
But, if you’re still struggling you should:
- Read other blogs, or watch YouTube videos on the same topic. You will benefit much more by discovering your own solutions.
- Ask the ‘Excel Ninja’ in your office. It’s amazing what things other people know.
- Ask a question in a forum like Mr Excel, or the Microsoft Answers Community. Remember, the people on these forums are generally giving their time for free. So take care to craft your question, make sure it’s clear and concise. List all the things you’ve tried, and provide screenshots, code segments and example workbooks.
- Use Excel Rescue, who are my consultancy partner. They help by providing solutions to smaller Excel problems.
What next?
Don’t go yet, there is plenty more to learn on Excel Off The Grid. Check out the latest posts:
I have wrote a code to print excel file to .PDF file with the page setups parameters.And also it eliminates the need of having a prompt dialog box also.
But I need to know if I need to name the .PDF file as same as the excel file name with below code but not the same destination path.As an example:= if excel file name is «Quality Report 1411185623689» This file is generated by a system therefore its name is changed everyday.
How do I solve this?
Sub Save_As_PDF()
With ActiveSheet.PageSetup
.Orientation=xlLandscape
.Zoom=16
End With
ActiveSheet.ExportAsFixedFormat _
Type:=xlTypePDF, _
FileName:="C:DesktopReportsSame as excel file name", _
Quality:=xlQualityStandard, _
IncludeDocProperties:=False, _
IgnorePrintAreas:=False, _
OpenAfterPublish:=True
Exit Sub
0m3r
12.2k15 gold badges33 silver badges70 bronze badges
asked Nov 14, 2018 at 3:53
3
Untested, but assuming you want to name the PDF the same as the Excel file (ignoring file extension), but in a different folder (say some folder/directory called "C:DesktopReports"
for example):
Option explicit
Sub SaveAsPDF()
Dim folderPath as string
folderPath = "C:DesktopReports" ' Change to whatever folder, but make sure it ends with a
If len(dir$(folderPath, vbDirectory)) = 0 then
Msgbox("'" & folderPath & "' is not a valid/existing directory. Abandoning export. Code will stop running now.")
Exit sub
End if
Dim Filename as string
Filename = left$(Thisworkbook.name, instrrev(Thisworkbook.name, ".", -1, vbbinarycompare) -1) & ".pdf"
With ActiveSheet.PageSetup
.Orientation=xlLandscape
.Zoom=16
End With
ActiveSheet.ExportAsFixedFormat _
Type:=xlTypePDF, _
FileName:=folderPath & filename, _
Quality:=xlQualityStandard, _
IncludeDocProperties:=False, _
IgnorePrintAreas:=False, _
OpenAfterPublish:=True
Exit Sub
answered Nov 14, 2018 at 4:18
chillinchillin
4,3511 gold badge8 silver badges8 bronze badges
3