エクセルで作成した資料をPDFデータに変換したい。
PDF変換処理をVBAで自動化する方法をご紹介します。
『PDF出力VBA』を使うことによって、
大量のデータを一瞬でPDFに変換できる、ファイル名+保存場所を毎回指定する必要がなくなる、など
作業効率アップに繋がるメリットを得ることができます。
毎日、「エクセルの編集 + PDF変換」のルーティーン作業をこなしている方は本記事を参考に自動化しちゃいましょう。
目次
ExportAsFixedFormatとは?基本概念と主な機能
ExportAsFixedFormatは、
VBAでExcelファイルをPDFやXPSといった固定レイアウト形式に変換するためのメソッド
です。
エクセルデータをPDFデータに変換するときには必ず使用されます。
ExportAsFixedFormatの基本を理解してPDF出力作業の効率をアップさせましょう。
ExportAsFixedFormatの基本的な使い方と構文
基本構造
object.ExportAsFixedFormat(Type, FileName, Quality, includedocproperties, ignoreprintareas, From, To, openafterpublish, FixedFormatExtClassPtr)
Type | XlFixedFormatType列挙を指定 |
FileName | 保存するファイルの名前 |
Quality | Xlfixedformatquality列挙定数を指定 |
IncludeDocProperties | ドキュメントプロパティを含める必要があることを示す場合はTrue、省略する場合はFalse |
IgnorePrintAreas | Trueの場合印刷範囲が無視、Falseの場合発行時に印刷範囲セット |
From | 発行を開始するページのページ番号を指定 |
To | 発行を終了するページの番号を指定 |
OpenAfterPublish | Trueの場合ファイルが公開された後にビューアーに表示、Falseの場合ファイル公開後ビューアー表示なし |
FixedFormatExtClassPtr | FixedFormatExtクラスへのポインター |
ぱっと見ただけでは難しそうと感じると思いますが、使い方はとてもシンプルでコツさえ掴めば簡単に扱えるようになるはずです。
複雑な処理は必要ない!という場合は、
「object」「Type」「FileName」3つの要素だけ
を設定するだけでOK。
具体例はこんな感じ
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=folder_path & “PDFデータ”
この場合、各要素の役割はこんな感じ
object・・・対象となるブックやシートを指定
→ActiveSheet
操作中のシートを対象とする
Type・・・出力形式を設定
→xlTypePDF
拡張子がPDF形式のファイルを作成する
FileName・・・保存先とファイル名を入力
→ThisWorkbook.Path & “\”& “PDFデータ”
マクロを設定したブックと同じ場所に「PDFデータ」というファイル名で出力される
難しく感じるポイントは「FileName」をどう定義するのかないでしょうか。
ファイル名にマクロ実行時の日付、時間を含めることでファイル名の被りによるエラーの発生を防ぐことができるのでおすすめです。
対応可能なファイル形式(PDF/XPS)の違い
ExportAsFixedFormatで出力できるファイル形式には主にPDFとXPSの2種類があります。
PDFはAdobe社が開発したポータブル・ドキュメント・フォーマットで、どのデバイスでも同じように表示できる利点があり、ビジネス文書の標準となっています。
一方、XPSはMicrosoft社が開発したXML Paper Specificationの略で、Windows環境での利用に最適化されています。
'PDF形式で出力する場合
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:="C:\Sample.pdf"
'XPS形式で出力する場合
ActiveSheet.ExportAsFixedFormat Type:=xlTypeXPS, Filename:="C:\Sample.xps"
それぞれの特徴として、
PDFは互換性と汎用性に優れているため、社外への提出書類や異なるOSを使用するユーザーとのやり取りに適している。
XPSはWindows環境での表示が速く、Microsoft製品との連携がスムーズ。
という点です。
目的に応じて適切な形式を選択しましょう。
ExportAsFixedFormat以外でのPDF出力方法
ExcelでPDFを出力する方法はExportAsFixedFormat以外にも、
「名前を付けて保存」からPDF形式を選ぶ方法や、印刷ダイアログからPDF出力する方法
があります。
「名前を付けて保存」からPDF形式を選ぶ方法はこんな感じ
印刷ダイアログからPDF出力する方法はこんな感じ
印刷ダイアログからPDF出力する方法をVBAで表現すると以下のようなコードになります。
'印刷機能を使った例(より複雑になる)
Sub PrintToPDF()
ActiveSheet.PrintOut PrToFileName:="C:\Report.pdf", PrintToFile:=True
End Sub
印刷VBAでもPDF出力することはできるのですが、
ExportAsFixedFormatを活用する方が細かなパラメーター設定が可能なこと、バッチ処理で大量のファイルを自動変換できること、そして何よりもコードの可読性と保守性に優れている
という大きな違いがあります。
個人的には、
VBAを使ってPDF出力をするならExportAsFixedFormatを使い、数個のデータをPDF出力するなら手作業で行う
という使い分けがおすすめです。
ExportAsFixedFormatによるPDF出力の実践例
ExportAsFixedFormatを使ったPDF出力VBAの実例をご紹介します。
ExportAsFixedFormatを使いこなすには、実際の使用例を見てコードを理解することが一番です。
日常業務でよく発生するシナリオに応じたサンプルコードを見ていきましょう。
初心者の方はまずシンプルな例から始めて、徐々に応用例へと進むことをおすすめします。
下記で紹介しているのサンプルコードをそのままコピーする、もしくは業務内容に合わせてアレンジする、など活用してみてください。
シンプルなワークシートのPDF出力(初心者向け)
初めてExportAsFixedFormatを使う方のために、最もシンプルなPDF出力の例を紹介します。
サンプル事例の内容は、
アクティブなワークシートを指定したファイル名でPDF出力する
という内容です。
サンプルコードがこちら
Sub シンプルPDF出力()
'変数宣言
Dim 保存先パス As String
'保存先設定
保存先パス = ThisWorkbook.Path & "\出力したPDF\" & ActiveSheet.Name & ".pdf"
'フォルダが存在しない場合は作成
If Dir(ThisWorkbook.Path & "\出力したPDF\", vbDirectory) = "" Then
MkDir ThisWorkbook.Path & "\出力したPDF\"
End If
'PDF出力実行
ActiveSheet.ExportAsFixedFormat _
Type:=xlTypePDF, _
Filename:=保存先パス, _
Quality:=xlQualityStandard, _
IncludeDocProperties:=True, _
IgnorePrintAreas:=False, _
OpenAfterPublish:=True
MsgBox "PDFを作成しました。" & vbCrLf & 保存先パス, vbInformation
End Sub
6行目のコードは、変数「保存パス」に「VBAを設定しているブックの場所」+「出力したPDF」+シート名を格納する
7行目のコードは、VBAを設定しているブックがフォルダに保存されていない場合、VBAを設定しているブックの場所に保存場所を指定する
14行目から20行目までのコードは、ExportAsFixedFormatを使ってVBAを設定しているブックの場所にPDF出力する
という意味です。
実行結果がこちら
現在開いているブックと同じフォルダに「出力したPDF」というサブフォルダを自動作成し、そこにアクティブシートと同名のPDFファイルを保存。
また、OpenAfterPublishをTrueに設定することで、出力後に自動的にPDFファイルを開くようにしています。
複数シートを一括でPDF出力する方法
サンプル事例として、
複数のワークシートを一度にPDF化する
という処理をご紹介します。
複数のシートをまとめてPDF化するVBAがあれば、
月次報告書で各部署のデータが別々のシートにある場合や、顧客ごとの請求書を一括生成する場合、など
いろんな場面で活用可能です。
ブック内の全シートを1つのPDFファイルにまとめるサンプルコードがこちら
Sub 全シート一括PDF出力()
'変数宣言
Dim 保存先パス As String
'保存先設定(今回はブック名をファイル名に使用)
保存先パス = ThisWorkbook.Path & "\" & Left(ThisWorkbook.Name, Len(ThisWorkbook.Name) - 5) & ".pdf"
'ワークブック全体をPDF出力
ThisWorkbook.ExportAsFixedFormat _
Type:=xlTypePDF, _
Filename:=保存先パス, _
Quality:=xlQualityStandard, _
IncludeDocProperties:=True, _
IgnorePrintAreas:=False, _
OpenAfterPublish:=True
MsgBox "全シートを1つのPDFにまとめました。" & vbCrLf & 保存先パス, vbInformation
End Sub
6行目のコードは、保存先のファイル名を現在のブック名から拡張子を除いた文字列にする(「売上集計.xlsx」なら「売上集計.pdf」という名前で保存される)
9行目のコードは、ブックに対して(全てのシートに対して)ExportAsFixedFormatでPDF出力する
という意味です。
実行結果がこちら
全シートをまとめてPDF化したいときに便利です。
選択範囲のみをPDF出力するテクニック
サンプル事例として、
特定の範囲だけをPDF出力する
という処理をご紹介します。
特定の範囲をPDF出力するVBAがあれば、
大きな分析シートの中から重要なグラフと表だけを抜き出して報告書にする、書類として提出するデータだけをPDF出力する、など
いろんな場面で活用可能です。
特定の範囲をPDF出力するVBAのサンプルコードがこちら
Sub 選択範囲のみPDF出力()
'変数宣言
Dim 選択範囲 As Range
Dim 保存先パス As String
Dim 印刷範囲の元設定 As String
'選択範囲がない場合はエラー
If Selection.Count = 0 Then
MsgBox "範囲が選択されていません。PDF化したい範囲を選択してから実行してください。", vbExclamation
Exit Sub
End If
'選択範囲を取得
Set 選択範囲 = Selection
'既存の印刷範囲を保存
印刷範囲の元設定 = ActiveSheet.PageSetup.PrintArea
'選択範囲を印刷範囲に設定
ActiveSheet.PageSetup.PrintArea = 選択範囲.Address
'保存先設定
保存先パス = ThisWorkbook.Path & "\選択範囲_" & Format(Now, "yyyymmdd_hhnnss") & ".pdf"
'PDF出力実行
ActiveSheet.ExportAsFixedFormat _
Type:=xlTypePDF, _
Filename:=保存先パス, _
Quality:=xlQualityStandard, _
IncludeDocProperties:=True, _
IgnorePrintAreas:=False, _
OpenAfterPublish:=True
'印刷範囲を元に戻す
ActiveSheet.PageSetup.PrintArea = 印刷範囲の元設定
MsgBox "選択範囲をPDF出力しました。" & vbCrLf & 保存先パス, vbInformation
End Sub
8行目から11行目のコードは、印刷範囲(PDF出力範囲)の指定がない場合にエラーを防止する
13行目から20行目のコードは、現在の印刷範囲を変数「印刷範囲の元設定」に格納し、選択中のセル範囲をPDF出力範囲に設定する
23行目から32行目のコードは、現在開いているブックと同じ場所に「選択範囲年月日時間」というファイル名でPDF出力する
35行目のコードは、印刷範囲をPDF出力範囲から元に戻す
という意味です。
こんなシート状況で特定の範囲をPDF出力するVBAを実行してみました。
印刷プレビューを確認すると、「この部分だけPDF出力したい」以外の範囲が含まれています。
次に、「この部分だけPDF出力したい」範囲を選択中にVBAを実行した結果がこちら
このサンプルコードのポイントは、
選択範囲をページ設定の印刷範囲として一時的に設定し、PDF出力後に元の印刷範囲に戻すことが可能
ファイル名に日時を含めることで何度実行しても上書きされない
という点です。
会議資料の作成や部分的なデータ共有など、必要な情報だけを素早く抽出したいときに活用してください。
ファイル名を自動生成して連続PDF出力する方法
サンプル事例として、
日報や週報など、定期的に提出が必要な書類を自動生成する
という処理をご紹介します。
日付を変えて日報を表示させPDF出力する
という処理を毎月、もしくは毎週行っている方が多くいらっしゃるのではないでしょうか。
このような作業をループ処理を使って複数のPDFを連続出力するサンプルコードがこちら
Sub 日付別PDF連続出力()
'変数宣言
Dim i As Integer
Dim 出力日 As Date
Dim 保存先パス As String
Dim 日付セル As Range
'日付を表示するセルを指定
Set 日付セル = Range("B2")
'開始日を設定(例:今月1日から)
出力日 = DateSerial(Year(Date), Month(Date), 1)
'今月分の日報を全て出力(1日から月末まで)
For i = 1 To Day(DateSerial(Year(Date), Month(Date) + 1, 0))
'日付セルに値を設定
日付セル.Value = 出力日 + i - 1
'保存先設定(日付をファイル名に含める)
保存先パス = ThisWorkbook.Path & "\日報\" & Format(日付セル.Value, "yyyy年mm月dd日") & "_日報.pdf"
'フォルダが存在しない場合は作成
If Dir(ThisWorkbook.Path & "\日報\", vbDirectory) = "" Then
MkDir ThisWorkbook.Path & "\日報\"
End If
'PDF出力実行
ActiveSheet.ExportAsFixedFormat _
Type:=xlTypePDF, _
Filename:=保存先パス, _
Quality:=xlQualityStandard, _
IncludeDocProperties:=True, _
IgnorePrintAreas:=False, _
OpenAfterPublish:=False
Next i
MsgBox "今月分の日報PDF(計" & i - 1 & "件)を作成しました。", vbInformation
End Sub
9行目のコードは、日付が入力されるB2セルを「日付セル」として格納する
12行目のコードは、「出力日」を今月の1日に設定する
15行目のコードは、1日から月末までの日付を繰り返す
17行目のコードは、B2セルに1日から月末まで繰り返される日付を入力する
20行目から34行目までのコードは、B2セルに入力される日付に対する日報を繰り返しPDF出力する
という意味です。
このサンプルコードのポイントは
B2セルに日付を自動入力する、その日付に対する資料を連続でPDF出力する
という点です。
条件を変更すれば週報や月報、特定期間の報告書なども同様に一括作成できます。
ExportAsFixedFormatの主要パラメータ解説
ExportAsFixedFormatメソッドの真価を発揮するには、
設定可能なパラメータを理解し適切に活用すること
です。
各パラメータの役割と使い方を知ることで、単なるPDF変換を超えた高度な出力制御が可能になります。
ここでは主要なパラメータを解説し、実務で役立つ設定例を紹介します。
Type・Filename・Quality パラメータの詳細設定
ExportAsFixedFormatで最も基本的なパラメータはType、Filename、Qualityの3つです。
これらのパラメータを正しく設定することで、目的に合ったファイル出力が可能になります。
特にQualityパラメータは出力されるPDFの品質に直接影響するため用途に応じた適切な設定が重要です。
下記のサンプルコードは、
「高品質で出力するコードと標準品質で出力するコードを比較
をしています。
Sub 基本パラメータ設定例()
'高品質PDF出力の例
ActiveSheet.ExportAsFixedFormat _
Type:=xlTypePDF, _
Filename:="C:\高品質資料.pdf", _
Quality:=xlQualityMinimum, _
IncludeDocProperties:=True
'標準品質PDF出力の例
ActiveSheet.ExportAsFixedFormat _
Type:=xlTypePDF, _
Filename:="C:\標準品質資料.pdf", _
Quality:=xlQualityStandard, _
IncludeDocProperties:=True
End Sub
4行目と11行目のコードは、TypeパラメータでxlTypePDF(値=0)またはxlTypeXPS(値=1)を指定
5行目と12行目のコードは、Filenameパラメータで絶対パスまたは相対パスでファイル名を指定
6行目と13行目のコードは、QualityパラメータでxlQualityMinimum(最高品質、値=0)またはxlQualityStandard(標準品質、値=1)を指定
という意味です。
品質の使い分けとしては、
印刷用の資料なら高品質、メール添付ならファイルサイズを抑えた標準品質
がおすすめです。
IncludeDocProperties・IgnorePrintAreas の活用法
ExportAsFixedFormatには文書プロパティの取り扱いや印刷範囲の制御に関するパラメータが用意されています。
IncludeDocPropertiesパラメータは、Excelのプロパティ情報をPDFに引き継ぐ。
IgnorePrintAreasパラメータは、事前に設定した印刷範囲を無視するかどうかを制御する。
を細かく設定可能です。
IncludeDocPropertiesパラメータとIgnorePrintAreasパラメータを使ったサンプルコードがこちら
Sub プロパティと印刷範囲の設定例()
'文書情報を含める例
ThisWorkbook.Properties.Title = "月次売上レポート"
ThisWorkbook.Properties.Subject = "営業部"
ThisWorkbook.Properties.Author = "山田太郎"
ActiveSheet.ExportAsFixedFormat _
Type:=xlTypePDF, _
Filename:="C:\プロパティあり.pdf", _
Quality:=xlQualityStandard, _
IncludeDocProperties:=True, _
IgnorePrintAreas:=False
'印刷範囲を無視する例
ActiveSheet.PageSetup.PrintArea = "A1:H20"
ActiveSheet.ExportAsFixedFormat _
Type:=xlTypePDF, _
Filename:="C:\印刷範囲無視.pdf", _
Quality:=xlQualityStandard, _
IncludeDocProperties:=True, _
IgnorePrintAreas:=True
End Sub
11行目と20行目のコードで、IncludeDocPropertiesをTrueにするとExcelファイルのタイトル、作成者、キーワードなどの情報がPDFに反映される
12行目のコードは、IgnorePrintAreasをFalseにして事前に設定した印刷範囲だけを出力する
21行目のコードは、IgnorePrintAreasをTrueにして印刷範囲設定を無視してシート全体が出力する。
という意味です。
用途に応じて使い分けることで、効率的なPDF生成が可能になります。
OpenAfterPublish・FromとToの使い方
OpenAfterPublish、From、Toの各パラメータは、
出力したPDFを自動的に開くようにしたり、特定のページ範囲だけを出力したりする
場合に使います
OpenAfterPublish、From、Toのパラメータを使ったサンプルコードがこちら
Sub 出力後動作とページ範囲設定例()
'出力後に自動で開く例
ActiveSheet.ExportAsFixedFormat _
Type:=xlTypePDF, _
Filename:="C:\自動で開く.pdf", _
Quality:=xlQualityStandard, _
OpenAfterPublish:=True
'特定ページ範囲のみ出力する例
ActiveSheet.ExportAsFixedFormat _
Type:=xlTypePDF, _
Filename:="C:\ページ指定.pdf", _
Quality:=xlQualityStandard, _
From:=2, _ '2ページ目から
To:=5, _ '5ページ目まで
OpenAfterPublish:=True
End Sub
7行目のコードは、OpenAfterPublishパラメータをTrueにしPDF出力後に自動的にそのファイルを開く
14行目と15行目のコードは、FromとToパラメータを使って2ページ目から5ページ目までをPDF出力する
という意味です。
多ページにわたる文書の一部だけを抽出したい場合には、FromとToパラメータを活用しましょう。
実務で使えるExportAsFixedFormat応用テクニック
ExportAsFixedFormatの基本を理解したら、次は実務で本当に役立つ応用テクニックを身につけましょう。
PDF出力の機能を他のVBA機能と組み合わせることで、より使いやすく高機能なツールを作ることができます。
ここからは、セキュリティ対策や柔軟なファイル管理、安定した動作を実現するための工夫を紹介します。
これらのテクニックをあなたの業務内容に合わせて活用することで、VBAによる業務効率化の可能性がさらに広がるでしょう。
PDFのセキュリティ設定(パスワード保護など)を追加する方法
重要な文書をPDFで配布する場合、セキュリティ対策は欠かせません。
残念ながらExportAsFixedFormatメソッド単体ではパスワード保護などのセキュリティ設定はできませんが、Adobe Acrobatのオブジェクトライブラリを利用することで実現可能です。
PDFファイルにパスワードを設定するサンプルコードがこちら
Sub パスワード付きPDF作成()
'変数宣言
Dim 保存先パス As String
Dim AcroApp As Object
Dim AcroPDF As Object
Dim 一時ファイル As String
'参照設定が必要:Adobe Acrobat X.0 Type Library
On Error Resume Next
Set AcroApp = CreateObject("AcroExch.App")
If Err.Number <> 0 Then
MsgBox "Adobe Acrobatがインストールされていないため、セキュリティ設定ができません。", vbExclamation
Exit Sub
End If
On Error GoTo 0
'一時的にパスワードなしPDFを作成
一時ファイル = ThisWorkbook.Path & "\temp_" & Format(Now, "yyyymmddhhnnss") & ".pdf"
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=一時ファイル
'最終保存先設定
保存先パス = ThisWorkbook.Path & "\セキュリティ付き.pdf"
'Acrobatを使ってセキュリティを設定
Set AcroPDF = CreateObject("AcroExch.PDDoc")
AcroPDF.Open 一時ファイル
'文書を開くパスワードを設定
AcroPDF.SetOpenPermission "owner_password", 0 '全ての操作を禁止
AcroPDF.SetPermission "user_password", 1 '閲覧のみ許可
'セキュリティ設定したPDFを保存
AcroPDF.Save 1, 保存先パス
AcroPDF.Close
AcroApp.Exit
'一時ファイルを削除
Kill 一時ファイル
MsgBox "パスワード保護付きPDFを作成しました。" & vbCrLf & 保存先パス, vbInformation
End Sub
このコードは、まずExportAsFixedFormatで通常のPDFを一時的に作成し、それをAdobe Acrobatのオブジェクトで開いてセキュリティ設定を加えた後、新しいファイルとして保存する流れになっています。
実行にはAdobe Acrobatのインストールと参照設定が必要です。
セキュリティレベルやパスワード強度は業務要件に合わせて調整してください。機密情報を含む報告書や社外に配布する資料など、情報漏洩リスクを減らすために役立つテクニックです。
フォルダ選択ダイアログを組み合わせた出力先指定
ExportAsFixedFormatでPDFを出力する際、保存先を毎回コードに直接記述するのはめんどくさいですよね。
保存先フォルダをダイアログで指定するVBAとPDF出力VBAを組み合わせれば、保存先のコードを編集する手間を省くことができます。
サンプルコードがこちら
Sub フォルダ選択ダイアログ付きPDF出力()
'変数宣言
Dim 保存先フォルダ As String
Dim 保存先パス As String
Dim ファイル名 As String
'フォルダ選択ダイアログを表示
With Application.FileDialog(msoFileDialogFolderPicker)
.Title = "PDFの保存先フォルダを選択してください"
.ButtonName = "選択"
.InitialFileName = ThisWorkbook.Path & "\"
'キャンセルされた場合は処理中止
If .Show = False Then
MsgBox "キャンセルされました。", vbExclamation
Exit Sub
End If
'選択されたフォルダを取得
保存先フォルダ = .SelectedItems(1)
End With
'ファイル名設定(現在日時を含める)
ファイル名 = ActiveSheet.Name & "_" & Format(Now, "yyyymmdd_hhnnss") & ".pdf"
保存先パス = 保存先フォルダ & "\" & ファイル名
'PDF出力実行
ActiveSheet.ExportAsFixedFormat _
Type:=xlTypePDF, _
Filename:=保存先パス, _
Quality:=xlQualityStandard, _
IncludeDocProperties:=True, _
IgnorePrintAreas:=False, _
OpenAfterPublish:=True
MsgBox "PDFを以下の場所に保存しました。" & vbCrLf & 保存先パス, vbInformation
End Sub
7行目から11行目のコードは、ダイアログで選択したフォルダの情報を取得する
13行目から17行目のコードは、選択をせずにダイアログを閉じたときメッセージボックスを表示させる
19行目から21行目のコードは、選択したフォルダ情報を変数「保存先フォルダ」に格納する
23行目から34行目のコードは、変数「保存先フォルダ」の情報を使ってPDF出力する
という意味です。
実際にサンプルコードを実行した様子がこちら
このコードは、
Application.FileDialogオブジェクトを使ってフォルダ選択ダイアログを表示しユーザーに保存先を選ばせる
ことが可能です。
さらに、ファイル名に現在の日時を含めることでファイルの上書きを防止にも対応しています。
このサンプルコードはいろんなエクセル業務に応用できるので、是非コピペして使ってください。
ExportAsFixedFormatのトラブルシューティング
VBAでPDF出力を行う際には様々なエラーや問題が発生することがあります。
トラブルが発生しても慌てず原因を特定してから対策を講じることが大切です。
ここからは、
よくあるエラーの対処法やPDF出力時の問題解決方法、そしてパフォーマンス向上のためのテクニックを紹介
します。
よくあるエラーとその対処法
ExportAsFixedFormatを使用する際によく遭遇するエラーとして、
「指定されたパスが見つかりません」や「このファイルは他のプログラムで使用されています」など
があります。
これらのエラーに対応するサンプルコードがこちら
Sub エラーハンドリング付きPDF出力()
'変数宣言
Dim 保存先パス As String
Dim 成功フラグ As Boolean
'初期設定
保存先パス = ThisWorkbook.Path & "\エラー対策済み_" & Format(Now, "yyyymmdd_hhnnss") & ".pdf"
成功フラグ = False
'エラーハンドリング開始
On Error GoTo エラー処理
'PDF出力実行
ActiveSheet.ExportAsFixedFormat _
Type:=xlTypePDF, _
Filename:=保存先パス, _
Quality:=xlQualityStandard, _
IncludeDocProperties:=True, _
IgnorePrintAreas:=False, _
OpenAfterPublish:=False
'成功フラグを立てる
成功フラグ = True
終了処理:
'結果に応じたメッセージ
If 成功フラグ Then
MsgBox "PDFを正常に出力しました。" & vbCrLf & 保存先パス, vbInformation
Else
MsgBox "PDF出力に失敗しました。", vbCritical
End If
Exit Sub
エラー処理:
Select Case Err.Number
Case 1004 '一般的なExcelエラー
If InStr(Err.Description, "アクセスが拒否されました") > 0 Then
MsgBox "PDFファイルが他のプログラムで開かれています。" & vbCrLf & _
"ファイルを閉じてから再実行してください。", vbExclamation
ElseIf InStr(Err.Description, "見つかりません") > 0 Then
MsgBox "保存先フォルダが存在しません。" & vbCrLf & _
"保存先を確認してください。", vbExclamation
Else
MsgBox "エラーが発生しました: " & Err.Description, vbCritical
End If
Case 75 'パスやファイルのアクセスエラー
MsgBox "指定したフォルダへのアクセス権がありません。", vbExclamation
Case Else
MsgBox "予期せぬエラーが発生しました。" & vbCrLf & _
"エラー番号: " & Err.Number & vbCrLf & _
"内容: " & Err.Description, vbCritical
End Select
Resume 終了処理
End Sub
11行目のコードは、On Error GoToステートメントを使ってエラーが発生した際の処理を指定
23行目のコードは、Boolean型変数を使ってPDF出力できたならTrue、出来なかったらFalse、2つの値のみを変数「成功フラグ」に格納する
27行目から32行目のコードは、変数「成功フラグ」がTrueのとき「PDFを正常に出力しました。」と表示し、Falseのとき「PDF出力に失敗しました。」というメッセージを表示する
34行目から53行目のコードは、変数「成功フラグ」がFalseのときのエラー内容によって表示させるメッセージを変更する
という意味です。
エラーの種類(エラー番号)ごとに適切なメッセージを表示することで、
すぐにエラー原因を特定し効率よくデバックする
ことが可能です。
デバックの方法は関連記事「VBA初心者できるデバックの方法」で解説しているので参考にしてみてください。
VBAを設定したけどエラーが発生して思い通りに動作しない こんな問題を『デバック』で解決します。 私はエクセル業務の効率をアップさせるために、エクセル作業を自動化するVBAをいくつも開発してきました。 そこで問題となるのは、VBAを実行したらエラーが発生して作業が中断されてしまうことです。 疲れ果てた人なぜエラーが出るの?どこが間違ってるかわからない。。。 このようにお困りの方は、本記事で解説する『デバックのテクニック』を参考にしてみてください。 難しいと思われがちなVBA... 【VBAのデバック方法】初心者でも5分で解決するテクニックをご紹介 - mamemametochan.com |
PDFが意図した通りに出力されない場合の確認ポイント
PDFは正常に出力されたけれど、レイアウトが崩れていたり内容が不完全だったりすることってありますよね。
そんなときは、ページ設定や印刷プレビューの確認が必要です。
でも、実際に不具合が発生したときなにが原因でどんなことを確認すればいいのかわからないという方がほとんどではないでしょうか。
こんなとき便利なのが、『チェックすべきポイントをPDF出力前に知らせてくれるVBA』です。
サンプルコードがこちら
Sub PDF出力前チェック()
'変数宣言
Dim 確認メッセージ As String
Dim 返答 As VbMsgBoxResult
'主要な確認ポイントをチェック
確認メッセージ = "PDF出力前に以下の項目を確認しましたか?" & vbCrLf & vbCrLf & _
"☑ ページ設定(余白・用紙サイズ・向き)" & vbCrLf & _
"☑ 印刷範囲の設定" & vbCrLf & _
"☑ 印刷タイトルの設定(ヘッダー行など)" & vbCrLf & _
"☑ セルの書式設定(折り返しなど)" & vbCrLf & _
"☑ 印刷プレビューでの最終確認" & vbCrLf & vbCrLf & _
"これらを確認後、PDF出力を実行しますか?"
'確認ダイアログ表示
返答 = MsgBox(確認メッセージ, vbQuestion + vbYesNo, "PDF出力前確認")
If 返答 = vbYes Then
'事前にページ設定を調整(例:A4縦向き設定)
With ActiveSheet.PageSetup
.PaperSize = xlPaperA4
.Orientation = xlPortrait
.LeftMargin = Application.InchesToPoints(0.7)
.RightMargin = Application.InchesToPoints(0.7)
.TopMargin = Application.InchesToPoints(0.75)
.BottomMargin = Application.InchesToPoints(0.75)
.HeaderMargin = Application.InchesToPoints(0.3)
.FooterMargin = Application.InchesToPoints(0.3)
.CenterHorizontally = True
.FitToPagesWide = 1
.FitToPagesTall = False
End With
'PDF出力実行
ActiveSheet.ExportAsFixedFormat _
Type:=xlTypePDF, _
Filename:=ThisWorkbook.Path & "\確認後出力_" & Format(Now, "yyyymmdd_hhnnss") & ".pdf", _
Quality:=xlQualityStandard, _
IncludeDocProperties:=True, _
IgnorePrintAreas:=False, _
OpenAfterPublish:=True
Else
MsgBox "PDF出力をキャンセルしました。" & vbCrLf & _
"印刷プレビューで内容を確認してから再実行してください。", vbInformation
'印刷プレビュー表示
ActiveSheet.PrintPreview
End If
End Sub
6行目から16行目のコードは、確認ポイントをメッセージボックスで表示させています。
実行した様子がこちら
「はい」を選ぶとA4縦向きで最適化した設定(18行目から32行目の印刷範囲を調整するVBA)でPDF出力し、「いいえ」を選ぶと印刷プレビューを表示します。
PDFが意図したとおりに出力されない主な原因として、用紙設定の不一致、印刷範囲の未設定、セルの書式設定(特に折り返し設定)の問題、数式やグラフの更新忘れなどがほとんどです。
サンプルコードのような事前に印刷プレビューで確認する仕組みを導入することで、ほとんどの問題を未然に防止することができます。
パフォーマンス改善テクニックと注意点
大量のシートをPDF出力する場合や複雑な計算式を含むブックを処理する場合には、パフォーマンスが問題になることがあります。
特に大規模なExcelファイルでは、PDF変換に時間がかかったり、メモリ不足になったりする可能性があるので注意が必要です。
こんな問題を解決するためのサンプルコードがこちら
Sub 高速PDF一括出力()
'変数宣言
Dim シート As Worksheet
Dim 保存先フォルダ As String
Dim 開始時間 As Double
Dim 画面更新状態 As Boolean
Dim 計算モード As XlCalculation
'処理時間計測開始
開始時間 = Timer
'高速化のための設定を保存
画面更新状態 = Application.ScreenUpdating
計算モード = Application.Calculation
'高速化設定
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.DisplayAlerts = False
'保存先設定
保存先フォルダ = ThisWorkbook.Path & "\高速PDF出力\"
'フォルダがなければ作成
If Dir(保存先フォルダ, vbDirectory) = "" Then
MkDir 保存先フォルダ
End If
'全シートをPDFとして保存
For Each シート In ThisWorkbook.Worksheets
'非表示シートはスキップ
If シート.Visible = xlSheetVisible Then
'進捗状況をステータスバーに表示
Application.StatusBar = シート.Name & " をPDF出力中..."
'データ範囲を特定して印刷範囲に設定
シート.UsedRange.Select
シート.PageSetup.PrintArea = シート.UsedRange.Address
'PDF出力
シート.ExportAsFixedFormat _
Type:=xlTypePDF, _
Filename:=保存先フォルダ & シート.Name & ".pdf", _
Quality:=xlQualityStandard, _
OpenAfterPublish:=False
End If
Next シート
'設定を元に戻す
Application.StatusBar = False
Application.ScreenUpdating = 画面更新状態
Application.Calculation = 計算モード
Application.DisplayAlerts = True
'フォルダを開く
Shell "explorer.exe " & 保存先フォルダ, vbNormalFocus
'処理時間を表示
MsgBox "PDF出力が完了しました。" & vbCrLf & _
"処理時間: " & Format(Timer - 開始時間, "0.00") & " 秒", vbInformation
End Sub
10行目のコードは、VBAの処理時間を計測するためのタイマーをスタートさせる
17行目から19行目のコードは、「画面更新の停止」「計算モードの手動設定」にして処理速度をアップさせる
21行目から27行目のコードは、エラーが発生しないように保存先フォルダを指定する
29行目から47行目のコードは、適切に印刷範囲を設定しながら全シートをPDF出力する
50行目から53行目のコードは、「画面更新」「計算モード」の設定を元に戻す
58行目から60行目のコードは、VBAの処理にかかった時間をメッセージボックスで表示する
という意味です。
実際にサンプルコードを実行した様子がこちら
パフォーマンス向上のその他のポイントとしては、
不要な数式を値に変換する、大きな画像やグラフを最適化する、PDF出力前に余分なシートを非表示にする、など
が挙げられます。
ただし高速化設定を行う際は、必ず最後に元の設定に戻すことを忘れないようにしましょう。
まとめ:効率的なPDF出力のためのベストプラクティス
ExportAsFixedFormatを使ったPDF出力の方法についてさまざまな角度から解説してきました。
いかがでしたでしょうか。
ExportAsFixedFormatのいっぱい設定できるパラメータを見て、「なんか難しそう。。。」「PDF出力VBAの導入は諦めよう。。。」と感じていた方も、
なんか出来そう!!と感じていただけたのではないでしょうか。
まとめとして、PDF出力VBAを設定するときのポイントがこちら
- 最小限のExportAsFixedFormatパラメータを設定する
- 印刷範囲を調整するVBAを設定する
- エラー発生時にデバックしやすいようエラーハンドリングコードを設定しておく
- 大量のページをPDF出力する場合は高速処理できるコードを設定する
まだPDF出力VBAは難しい。。。と言う方は「最小限のExportAsFixedFormatパラメータを設定する」だけでもOKです。
PDF出力作業を自動化してエクセル作業の効率化を実現してみてください。
でも、本業が忙しくてVBAコードを作っている時間がない。。。
このような方は、マメBlogVBA開発代行サービスの利用を検討してみてください。
マメBlogVBA開発代行サービスは
「こんなエクセル作業を自動化するVBAを作って欲しい」
と伝えるだけ。
VBAの開発は可能か、見積もり金額、納期をすぐ回答致します。
ガッツポーズの人
毎日おこなっているルーティーン作業、手間のかかる単純作業をVBAの力で自動化してしまいましょう。
ご相談、お見積りの依頼は無料ですのでお気軽にお問い合わせください。