Excel(エクセル)で作成した見積書、請求書、月次レポートなどの書類を、相手先の環境に依存せず、改ざんも防げる「PDF形式」に変換して送付することは、現代のビジネスにおいて必須の作業です。しかし、毎回「ファイル」タブを開き、「名前を付けて保存」からPDF形式を選び、保存先フォルダを探してファイル名を手入力する……という手作業を繰り返すのは、非常に手間がかかり、保存先やファイル名のミス(ヒューマンエラー)を誘発する原因にもなります。 Excel VBA(マクロ)を使用すれば、このようなPDFへの書き出し・保存作業を「ボタンを1回クリックするだけ」で完全に自動化することが可能です。 この記事では、VBAを使ってExcelのシートや特定の範囲をPDFとして出力・保存するマクロの作り方を、初心者にも分かりやすく網羅的に解説します。単にPDF化するだけでなく、日付や顧客名を組み込んだ「ファイル名の自動生成」、デスクトップや特定の共有フォルダへの「保存先の自動指定」、さらにはよく起こる「実行時エラーの対処法」や「印刷レイアウトの崩れを防ぐ設定」まで、実務で即戦力となるテクニックをすべて詰め込んでいます。
目次
- 1. VBAでPDFを出力する基本メソッド(ExportAsFixedFormat)
- 2. 【基本編】現在開いているシートをPDF化するシンプルなマクロ
- 3. 【応用編】ファイル名と保存先パスを動的に自動生成する
- 4. 【実用編】複数シートや特定のセル範囲だけをPDF化する方法
- 5. ユーザーに保存先を選ばせる(ダイアログの表示)
- 6. PDF出力時に発生するエラーの原因と対処法
- 7. 実務でそのまま使えるコピペ用完成版マクロ
- 8. まとめ
1. VBAでPDFを出力する基本メソッド(ExportAsFixedFormat)
VBAでExcelのデータをPDF化するために使用する心臓部のメソッドが「ExportAsFixedFormat(エクスポート・アズ・フィックスド・フォーマット)」です。 このメソッドは、指定したオブジェクト(ワークシート、セル範囲、ワークブック全体など)を、PDFまたはXPS形式で出力するための命令です。基本的な構文は以下のようになります。
オブジェクト.ExportAsFixedFormat Type:=xlTypePDF, Filename:="保存先のフルパス"
主な引数(パラメータ)は以下の通りです。
- Type: 出力するファイル形式を指定します。PDFの場合は必ず
xlTypePDFと記述します。 - Filename: 保存する場所とファイル名をフルパス(例:C:\Work\見積書.pdf)で指定します。省略した場合は、カレントフォルダに標準のファイル名で保存されます。
- Quality: 画質を指定します。
xlQualityStandard(標準)またはxlQualityMinimum(最小サイズ)が選べます。省略時は標準になります。 - IncludeDocProperties: ドキュメントのプロパティ(作成者などの情報)を含めるかどうか(True/False)。
- IgnorePrintAreas: 印刷範囲を無視するかどうか(True/False)。Falseにすると、Excel側で設定された印刷範囲のみが出力されます。
- OpenAfterPublish: PDFを出力した直後に、そのPDFファイルを自動的に開いて画面に表示させるかどうかを指定します(Trueにすると出力後にPDFビューアが立ち上がります)。
実務においては、「Type」「Filename」そして出力結果の確認に便利な「OpenAfterPublish」の3つをコントロールできれば十分に強力なマクロを作成できます。
2. 【基本編】現在開いているシートをPDF化するシンプルなマクロ
まずは、現在画面に表示されているアクティブなシートを、指定したフォルダに決まった名前でPDF保存する、最も基本となるマクロを作成してみましょう。 キーボードの「Alt」キーを押しながら「F11」キーを押してVBE(Visual Basic Editor)を開き、「挿入」メニューから「標準モジュール」を追加して、以下のコードを記述します。
Sub ExportPDF_Basic()
' アクティブなシートをPDFとして出力する
ActiveSheet.ExportAsFixedFormat _
Type:=xlTypePDF, _
Filename:="C:\TestFolder\Sample.pdf", _
OpenAfterPublish:=True
MsgBox "PDFの出力が完了しました。", vbInformation
End Sub
【解説】 このコードは、Cドライブの中にある「TestFolder」というフォルダの中に、「Sample.pdf」という名前でPDFを保存します。 OpenAfterPublish:=True と設定しているため、マクロの実行が終わると同時に作成されたPDFファイルが自動的に開き、レイアウト崩れがないかをすぐに確認することができます。 ※注意:事前に「C:\TestFolder」というフォルダがパソコン上に存在していないと、エラーが発生します。
3. 【応用編】ファイル名と保存先パスを動的に自動生成する
基本編のコードのように、保存先のパス(C:\…)を直接コード内に固定文字として書き込んでしまう(ハードコーディングと呼びます)と、別のパソコンで実行した際や、フォルダ構成が変わった際にエラーになってしまいます。 また、実務では「毎回違うファイル名で保存したい(上書きを防ぎたい)」というニーズが必ずあります。これを解決するために、変数を使ってパスとファイル名を動的に組み立てます。
マクロが保存されているのと同じフォルダに保存する
「このExcelファイルが置かれている場所と同じフォルダ」にPDFを出力したい場合は、ThisWorkbook.Path というプロパティを使用します。これにより、USBメモリで持ち運んだり、別の共有サーバーに移動したりしても、常に自分のいる場所を起点に保存してくれます。
Sub ExportPDF_SameFolder()
Dim savePath As String
' ThisWorkbook.Pathで現在のフォルダのパスを取得し、ファイル名を結合する
' 末尾に「\」が必要な点に注意
savePath = ThisWorkbook.Path & "\出力レポート.pdf"
ActiveSheet.ExportAsFixedFormat _
Type:=xlTypePDF, _
Filename:=savePath, _
OpenAfterPublish:=True
End Sub
今日の日付をファイル名に自動付与する
上書きを防ぎ、いつ作成したデータかを明確にするために、ファイル名の末尾に今日の日付(例:20260418)を付与するテクニックです。日付の取得と整形には Format 関数を使用します。
Sub ExportPDF_WithDate()
Dim savePath As String
Dim dateStr As String
' 今日の日付を「yyyymmdd」形式で取得する
dateStr = Format(Date, "yyyymmdd")
' フォルダパス + ファイル名 + 日付 + 拡張子 を結合
savePath = ThisWorkbook.Path & "\見積書_" & dateStr & ".pdf"
ActiveSheet.ExportAsFixedFormat _
Type:=xlTypePDF, _
Filename:=savePath
MsgBox savePath & vbCrLf & "を出力しました。", vbInformation
End Sub
特定のセルに入力された値(顧客名など)をファイル名にする
請求書などを作成する際、シート内の特定のセル(例えばB2セルに入力された「株式会社〇〇」という会社名)を取得して、それをファイル名に利用する方法です。
Sub ExportPDF_WithCellValue()
Dim savePath As String
Dim companyName As String
' B2セルの値を取得
companyName = Range("B2").Value
' セルが空欄の場合は処理を中断する安全策
If companyName = "" Then
MsgBox "B2セルに会社名が入力されていません。", vbExclamation
Exit Sub
End If
' ファイル名を組み立てる(例:請求書_株式会社〇〇.pdf)
savePath = ThisWorkbook.Path & "\請求書_" & companyName & ".pdf"
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=savePath
End Sub
4. 【実用編】複数シートや特定のセル範囲だけをPDF化する方法
これまでは ActiveSheet を対象にしていましたが、オブジェクトの指定を変更することで、出力範囲を柔軟にコントロールできます。
特定のセル範囲だけをPDF化する
シート全体ではなく、表の部分(A1からF20まで)だけをPDF化したい場合は、対象を Range オブジェクトに変更します。
Sub ExportPDF_Range()
Dim savePath As String
savePath = ThisWorkbook.Path & "\部分出力.pdf"
' 指定したセル範囲(A1:F20)に対してExportAsFixedFormatを実行する
Range("A1:F20").ExportAsFixedFormat _
Type:=xlTypePDF, _
Filename:=savePath, _
OpenAfterPublish:=True
End Sub
複数のシートを1つのPDFファイルに結合して出力する
例えば「表紙」「見積明細」「注意事項」のように3つのシートに分かれている情報を、1つのPDFファイル(全3ページ)にまとめて出力したい場合、対象シートを配列(Array)でグループ化して選択状態にし、それを対象に実行します。
Sub ExportPDF_MultipleSheets()
Dim savePath As String
savePath = ThisWorkbook.Path & "\一括出力レポート.pdf"
' 出力したいシートの名前を配列で指定し、同時に選択する
Worksheets(Array("表紙", "見積明細", "注意事項")).Select
' 選択されたシート(ActiveSheet)を出力すると、1つのPDFに結合される
ActiveSheet.ExportAsFixedFormat _
Type:=xlTypePDF, _
Filename:=savePath, _
OpenAfterPublish:=True
' 複数選択状態を解除するため、最初のシートだけを選択し直す
Worksheets("表紙").Select
End Sub
5. ユーザーに保存先を選ばせる(ダイアログの表示)
ファイル名はある程度自動で決めたいが、保存先のフォルダは毎回ユーザーに選ばせたいという場合は、Excel標準の「名前を付けて保存」ダイアログを呼び出す Application.GetSaveAsFilename メソッドを使用します。
Sub ExportPDF_WithDialog()
Dim defaultName As String
Dim savePath As Variant
' デフォルトでダイアログに表示させるファイル名を用意
defaultName = "月次レポート_" & Format(Date, "yyyymmdd") & ".pdf"
' 「名前を付けて保存」ダイアログを表示
' FileFilterでPDFファイルのみを指定
savePath = Application.GetSaveAsFilename( _
InitialFileName:=defaultName, _
FileFilter:="PDFファイル (*.pdf), *.pdf", _
Title:="PDFの保存先を指定してください" _
)
' ユーザーが「キャンセル」を押した場合はFalseが返るので処理を終了
If savePath = False Then
MsgBox "PDF出力をキャンセルしました。", vbInformation
Exit Sub
End If
' ユーザーが指定したパス(savePath)でPDFを出力
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=savePath
MsgBox "保存が完了しました。", vbInformation
End Sub
6. PDF出力時に発生するエラーの原因と対処法
PDFを出力するマクロを実務で運用し始めると、いくつかのエラーに遭遇します。これらを未然に防ぐための堅牢なエラー処理(エラートラップ)を組み込むことが、優れたマクロの条件です。
実行時エラー ‘1004’(同名ファイルがすでに開かれている)
VBAでPDFを出力する際、最も頻発するエラーが「実行時エラー 1004: ドキュメントを保存できませんでした。開いているか、保存時にエラーが発生した可能性があります。」というものです。 これは、前回出力した同名のPDFファイルが、Acrobat ReaderやブラウザなどのPDFビューアアプリで現在開かれたままになっている状態で、VBAがそのファイルに上書き保存をしようとしてブロックされたことが原因です。 これを防ぐには、エラーが発生した際にマクロを強制終了させず、ユーザーに「PDFを閉じてください」と警告を出す処理を記述します。
パスが存在しない、またはアクセス権限がないエラー
保存先に指定したフォルダ名が変更されていたり、削除されていたりするとエラーになります。出力前に Dir 関数を使用して、指定したフォルダが存在するかどうかをチェックする処理を入れると安全です。
PDFのレイアウトが崩れる・見切れる場合の対策
Excelの画面上では問題ないのに、VBAでPDF化すると右端が切れたり、複数ページに分かれたりすることがあります。これはPDF出力前に、シートの印刷設定(ページレイアウト設定)が適切に行われていないためです。 VBAの PageSetup オブジェクトを使用して、PDF出力直前に「すべての列を1ページに印刷する」設定を強制適用させることで、レイアウト崩れを完全に防ぐことができます。
7. 実務でそのまま使えるコピペ用完成版マクロ
これまでの応用・エラー処理・レイアウト調整のすべての要素を統合した、実務で絶対に失敗しない「究極のPDF出力マクロ」の完成版コードです。このままコピーして現場の業務にご活用ください。
Sub ExportPDF_Professional()
Dim ws As Worksheet
Dim folderPath As String
Dim fileName As String
Dim savePath As String
' 対象シートを設定
Set ws = ActiveSheet
' 保存先フォルダ(このマクロと同じフォルダ内にある"PDF出力"というフォルダ)
folderPath = ThisWorkbook.Path & "\PDF出力"
' フォルダが存在しない場合は自動的に作成する
If Dir(folderPath, vbDirectory) = "" Then
MkDir folderPath
End If
' ファイル名を自動生成(シート名 + 日付時刻)
fileName = ws.Name & "_" & Format(Now, "yyyymmdd_HHMMSS") & ".pdf"
savePath = folderPath & "\" & fileName
' --- レイアウト崩れを防ぐための印刷設定の最適化 ---
Application.ScreenUpdating = False ' 画面のちらつき防止
With ws.PageSetup
.Zoom = False ' 拡大縮小のパーセンテージ指定を無効化
.FitToPagesWide = 1 ' 横(列)を1ページに収める
.FitToPagesTall = False ' 縦(行)はページをまたいでもOKとする
.Orientation = xlPortrait ' 用紙の向きを縦(横の場合は xlLandscape)
.CenterHorizontally = True ' 左右を中央に揃える
End With
Application.ScreenUpdating = True
' --- エラー監視の開始(同名ファイルが開かれている場合の対策) ---
On Error GoTo ErrorHandler
' PDF出力処理の実行
ws.ExportAsFixedFormat _
Type:=xlTypePDF, _
Filename:=savePath, _
Quality:=xlQualityStandard, _
IncludeDocProperties:=True, _
IgnorePrintAreas:=False, _
OpenAfterPublish:=True ' 出力後にPDFを開く
' 正常に処理が終わった場合はここで終了
MsgBox "PDFの出力に成功しました。" & vbCrLf & "保存先: " & savePath, vbInformation
Exit Sub
' エラーが発生した時の飛び先
ErrorHandler:
' エラー番号1004(保存できないエラー)の場合の特別なメッセージ
If Err.Number = 1004 Then
MsgBox "エラーが発生しました。" & vbCrLf & _
"同名のPDFファイルが既に開かれている可能性があります。" & vbCrLf & _
"PDFビューアを閉じてから、再度実行してください。", vbCritical, "出力失敗"
Else
' その他の予期せぬエラー
MsgBox "予期せぬエラーが発生しました。" & vbCrLf & _
"エラー内容: " & Err.Description, vbCritical, "出力失敗"
End If
' エラー状態をクリア
Err.Clear
End Sub
このコードの特徴は、保存用の専用フォルダを自動作成し、秒単位までのタイムスタンプを付けることで「上書き」を完全に回避している点です。さらに、VBAがPDFを出力する直前にページレイアウト設定を強制的に整えるため、誰のパソコンで実行しても絶対に文字が見切れることがありません。
8. まとめ
Excel VBAを使用してPDFを出力・保存するマクロは、ExportAsFixedFormat というたった1行のメソッドを理解するだけで、誰でも簡単に構築することができます。 しかし、実務で真に役立つマクロにするためには、「単にPDFに変換する」だけでなく、以下のポイントを押さえることが不可欠です。
ThisWorkbook.PathやFormat関数を使って、ファイル名と保存先を自動的に組み立てること。- 同名のPDFファイルが開かれたままになっていることで発生する「実行時エラー 1004」を想定し、エラー処理(On Error)を必ず組み込むこと。
- PDFの文字切れを防ぐために、PageSetupを用いた印刷レイアウトの最適化を同時に行うこと。
毎日のように発生する「PDF化して保存する」というルーチンワークは、マクロの導入効果が最も分かりやすく表れる業務の1つです。本記事で紹介した完成版コードをベースに、自社のフォーマットや業務フローに合わせて自由にカスタマイズし、圧倒的な業務効率化を実現してください。