VBAを使うと、エクセルブック内の複数シートをPDFとして出力させることができます。
エクセルの印刷機能を使えば、特定のシートや全てのシートをPDFとして出力させることができます。
しかしシートを指定する作業や印刷する工程は入力が必要になってしまいます。
そこでエクセルマクロVBAを使って、必要なシートをPDFとして保存する方法を紹介します。
・対象シートを連続でPDFとして保存
上記について紹介します。ファイルダウンロードだけではなくコード解説もしていきます。
目次
エクセルマクロVBAでExportAsFixedFormatを使ってPDF出力・保存
エクセルシートをPDFとして出力するときは、ExportAsFixedFormatを使います。
ExportAsFixedFormatは以下の引数を使って、細かく印刷条件を決定できます。
1 |
式.ExportAsFixedFormat ( Type , FileName, Quality, IncludeDocProperties, IgnorePrintAreas, From, To, OpenAfterPublish, FixedFormatExtClassPtr) |
式には、ワークブックやワークシートなどが入ります。
引数の説明は以下のとおりです。
名前 | 必須 / 省略可能 | データ型 | 説明 |
Type | 必須 | XlFixedFormatType | エクスポート後のファイル形式を指定します。 |
FileName | 省略可能 | Variant | 保存されるファイルの名前を指定します。 完全なパスを含めるか、Excelを現在のフォルダーに保存できます。 |
Quality | 省略可能 | Variant | オプション の XlFixedFormatQuality. 発行されたファイルの品質を指定します。 |
IncludeDocProperties | 省略可能 | Variant | True を指定すると、ドキュメントのプロパティが含まれます。それ以外の場合は False です。 |
IgnorePrintAreas | 省略可能 | Variant | True を指定すると、発行時に設定された印刷領域が無視されます。それ以外の場合は False です。 |
From | 省略可能 | Variant | 発行を開始するページのページ番号を指定します。 この引数を省略すると、先頭のページから発行が開始されます。 |
To | 省略可能 | Variant | 発行を終了するページの番号を指定します。 この引数を省略すると、最後のページまで発行します。 |
OpenAfterPublish | 省略可能 | Variant | True を指定すると、ファイルが発行された後にビューアーにファイルが表示されます。それ以外の場合は False です。 |
FixedFormatExtClassPtr | 省略可能 | Variant | FixedFormatExt クラスへのポインターです。 |
Typeは必須なので、省略不可です。xlTypePDFを選択してPDFを出力できます。
FileNameでファイルの保存先を指定することができます。
もし作成したPDFを即座に確認したい場合は、「OpenAfterPublish:=True」を使います。
VBA作成前の事前準備
ExcelでVBAを使うためにはいくつかの準備が必要です。
具体的には以下です。
上記に関して、以下で説明します。
準備1. ExcelでVBAを使うための事前準備
エクセルVBAを使うためには、保存ファイルの拡張子変更、Excelの基本設定変更の2つをしておきます。
2つともで難しい作業はなく、それぞれ1分もあれば設定変更可能です。
上記に関しては、以下の記事で解説をしています。
もしVBAを使うための準備段階に不安がある人は上記をご覧ください。
この内容は以下の動画で紹介しています。
入門エクセルマクロの使い方|マクロ作成から実行までを徹底解説
文字や画像だけで分かりづらい人は上記の動画をご覧ください。
エクセルのシートをPDFとして出力
2. 連続して複数ワークシートをPDFとして出力
上記について紹介していきます。
なおVBAでPDFを操作する事例を以下で紹介しています。
VBAでPDF操作をしたい人はご覧ください。
1. 特定のワークシートをPDFとして出力
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
'プログラム0|変数設定の指定 Option Explicit 'プログラム1|プログラム開始 Sub ExportPDF() 'プログラム2|シートを設定 Dim templatesheet As Worksheet Set templatesheet = ThisWorkbook.Worksheets("template") 'プログラム3|プログラム2で指定したシートをPDF出力 Dim pdfname As String pdfname = ThisWorkbook.Path & "\template.pdf" templatesheet.ExportAsFixedFormat xlTypePDF, pdfname 'プログラム4|プログラム終了 End Sub |
プログラム2で設定したtemplateシートを、プログラム3でPDFとして出力します。
ExcelからPDFを出力する事例
上記のプログラムで、ワークシートで指定したシートをファイル名でPDFとして出力することができます。
エクセルからPDF出力する事例として、以下の請求書作成プログラムで解説をしています。
WordからPDFを出力する事例
エクセルとは異なりますが、ワードをPDFとして出力する事例も紹介しておきます。
ワードをPDF出力する事例として、以下のワードに差し込みを行いPDF出力するプログラムを解説しています。
2. 連続して複数ワークシートをPDFとして出力
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
'プログラム0|変数設定の指定 Option Explicit 'プログラム1|プログラム開始 Sub ConvertPDFfromExcel() 'プログラム2|各ワークシートを処理してシート名を取得 Dim ws As Worksheet For Each ws In ThisWorkbook.Worksheets Dim sheetname As String sheetname = ws.Name Debug.Print sheetname 'プログラム3|「Sheet1」もしくは「template」の場合は処理をスキップ If sheetname = "Sheet1" Or sheetname = "template" Then GoTo Continue End If 'プログラム4|PDF出力して表示 Dim pdfname As String pdfname = ThisWorkbook.Path & "\" & sheetname & ".pdf" Debug.Print pdfname ws.ExportAsFixedFormat Type:=xlTypePDF, Filename:=pdfname, openafterpublish:=True 'プログラム5|プログラム3で処理をスキップする場合の行先 Continue: Next 'プログラム6|プログラム終了 End Sub |
それでは、以下でプログラムを詳しく説明していきます。
プログラム0|変数宣言の指定
1 |
Option Explicit |
「Option Explicit」とは、変数宣言を強制するためのものです。
予期しないエラーを防止できるため「Option Explicit」を入力することを習慣化することを推奨しています。
詳しい説明は以下のページで紹介しています。
また変数については、以下のページで紹介しています。
プログラム1|プログラム開始
1 |
Sub ConvertPDFfromExcel() |
「Sub ConvertPDFfromExcel()」のプログラムを開始することを意味します。
VBAではプロシージャという単位でプログラムを呼び出します。
プロシージャの構文は下記となっています。
1 2 3 |
Sub プロシージャ名() '実行プログラム End Sub |
「Sub」で始まり「End Sub」で終わります。
プロシージャに関連するmoduleの話については以下で説明しています。
プログラム2|シートを処理
1 2 3 4 5 |
Dim ws As Worksheet For Each ws In ThisWorkbook.Worksheets Dim sheetname As String sheetname = ws.Name |
エクセルの全てのワークシートを取得して一つずつ処理します
そして各ワークシートの名前をsheetnameと取得します。
Debug.Printでの検証結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Dim ws As Worksheet For Each ws In ThisWorkbook.Worksheets Dim sheetname As String sheetname = ws.Name Debug.Print sheetname Next >>>Sheet1 >>>愛知販売 >>>愛媛不動産 >>>茨城信託 >>>愛知製本 >>>茨城物産 >>>template |
上記のとおりsheetnameで全てのシート名を取得できていることが分かります。
プログラム3|「Sheet1」もしくは「template」の場合は処理をスキップ
1 2 3 |
If sheetname = "Sheet1" Or sheetname = "template" Then GoTo Continue End If |
シート名がSheet1もしくはtemplateの場合は、GoTo Continueでプログラム4を省略して、プログラム5に強制移動させます。
これにより、シート名がSheet1とtemplateの場合は、プログラム4をスキップしてPDF出力を省略させることができます。
参考情報
ここでは、2つのIf文をOrでつないでいます。If文については以下のページで事例を使いながら解説をしています。
また特定条件で処理をスキップさせる方法については、以下のページで事例を使いながら解説しています。
なお以下のページではForNext文の事例を紹介していますが、特定条件で処理をスキップさせる方法はForEachでも共通です。
プログラム4|PDF出力して表示
1 2 3 |
Dim pdfname As String pdfname = ThisWorkbook.Path & "\" & sheetname & ".pdf" ws.ExportAsFixedFormat Type:=xlTypePDF, Filename:=pdfname, openafterpublish:=True |
pdfnameでPDF出力したときのファイルパスを設定します。
「ws.ExportAsFixedFormat Type:=xlTypePDF, Filename:=pdfname, openafterpublish:=True」で、対象のワークシートをPDFとして出力します。
openafterpublish:=Trueとなっているので、PDF出力と同時にPCウィンドウにPDFを出力します。
プログラム5|プログラム3で処理をスキップする場合の行先
1 2 |
Continue: Next |
プログラム3でシート名がSheet1もしくはtemplateだった場合の行先です。
プログラム6|プログラム終了
1 |
End Sub |
これでプログラムは終了です。
Excel VBAについて詳しく理解したいなら
VBAを活用すると、仕事を効率化できる幅を広げることができます。
たとえば私が実際にVBAを活用して効率化してきた作業は以下の記事で紹介しています。
興味がある人は以下の記事もご覧ください。
動画でも解説しています。
エクセルマクロVBAで出来ることを15の事例で紹介|日常業務をラクにするヒントを見つけよう!
(音声が小さいので、ボリュームを上げてご覧いただければと思います)
VBAの勉強方法
私はプログラミング初心者からVBAを勉強を始めて少しずつレベルアップしていきました。
成長の過程は以下で紹介しています。
学習の過程では、意識すべきポイントがあります。
特に独学の場合だと、勉強を優先してしまい、肝心な実践を疎かにしがちです。
私の経験では、実践から逆算した勉強が必要だと考えています。
目指すべきは会社でお金をもらいながら勉強することです。
要はVBAを仕事の一つとして上司に認めてもらうのです。
そうすればわざわざ高いお金を払って勉強をする必要がなくなります。
しかも作業を自動化して、会社やチームに貢献しつつ、自らのスキルアップできます。
そのために必要な考え方を以下で紹介しています。
とはいえ、プログラミング初心者でVBAについて知識ゼロの人もいるはずです。
いきなり会社でVBAで使うことさえ、とてつもなくハードルが高く見えてしまうものです。
その場合は、VBAの基本について学ぶ必要があります。
たとえば車の運転も慣れてしまえば、たいしたことではありません。
しかし教習所で運転の基本を学び、免許を取得することで、公道で運転できるようになります。
VBAも同じです。VBAに免許はありませんが、まずは基本を学ばないことには会社で使えるレベルにはなりません。
実際に私もプログラミング初心者のときは、動画を見たり書籍を読んだりして勉強しました。
今はオンラインの教材で無料で学習できるものも多いです。
上記のリンクでは、私の経験から勉強にオススメの教材を紹介しています。
興味がある人はご覧ください。