Excel VBAでまとめてPDF出力:ブック全体・選択シートを自動化
全シートを1つのPDFファイルにまとめて出力
ブック内のすべてのシートを結合して1本のPDFに出力する方法です。流れはシンプルで、印刷設定をそろえたうえで、出力したいシートをまとめて選び、ExportAsFixedFormatを1回だけ実行します。これによりページ順も安定し、ファイルも1つだけで管理できます。
手順の全体像
- ブックを保存してバックアップを確保する(任意)
- すべてのシートで印刷範囲・余白・向き・用紙サイズをそろえる
- 非表示シートを出力対象に含めるか決める(含めないのが無難)
- シートの並び順を確認する(この順序がPDFのページ順になる)
- 保存先フォルダーとファイル名を決める
- 選択シートをまとめてExportAsFixedFormatで1回出力
サンプルコード(結合PDF)
Option Explicit
Public Sub ExportAllSheetsAsOnePdf()
Dim wb As Workbook
Dim arr() As Variant
Dim i As Long
Dim savePath As String
Set wb = ThisWorkbook ‘必要に応じてActiveWorkbook
‘保存先とファイル名(ブック名と同じにする例)
savePath = wb.Path & Application.PathSeparator & wb.Name & “_all.pdf”
‘非表示シートは除外(必要なら条件を変更)
ReDim arr(1 To VisibleSheetCount(wb))
For i = 1 To wb.Worksheets.Count
If wb.Worksheets(i).Visible = xlSheetVisible Then
arr(VisibleIndex(wb.Worksheets(i))) = wb.Worksheets(i).Name
End If
Next i
If UBound(arr) = 0 Then
MsgBox “出力可能なシートがありません。”, vbExclamation
Exit Sub
End If
Application.ScreenUpdating = False
Application.DisplayAlerts = False
On Error GoTo CleanFail
wb.Worksheets(arr).Select
ActiveSheet.ExportAsFixedFormat _
Type:=xlTypePDF, _
Filename:=savePath, _
Quality:=xlQualityStandard, _
IncludeDocProperties:=True, _
IgnorePrintAreas:=False, _
OpenAfterPublish:=False
MsgBox “PDFを出力しました: ” & savePath, vbInformation
CleanExit:
wb.Worksheets(1).Select
Application.DisplayAlerts = True
Application.ScreenUpdating = True
Exit Sub
CleanFail:
MsgBox “出力中にエラーが発生しました。” & vbCrLf & Err.Number & “: ” & Err.Description, vbCritical
Resume CleanExit
End Sub
Private Function VisibleSheetCount(ByVal wb As Workbook) As Long
Dim c As Long, i As Long
For i = 1 To wb.Worksheets.Count
If wb.Worksheets(i).Visible = xlSheetVisible Then c = c + 1
Next i
VisibleSheetCount = c
End Function
Private Function VisibleIndex(ByVal ws As Worksheet) As Long
‘ワークブック内の「表示シート」の並び順で連番を返す
Dim i As Long, idx As Long
For i = 1 To ws.Parent.Worksheets.Count
If ws.Parent.Worksheets(i).Visible = xlSheetVisible Then
idx = idx + 1
If ws.Parent.Worksheets(i).Name = ws.Name Then
VisibleIndex = idx
Exit Function
End If
End If
Next i
End Function
確認チェックリスト
- 印刷範囲(PageSetup.PrintArea)が空の場合は想定外の領域が出る
- 余白、向き、用紙サイズが混在するとページ割りが崩れる
- ページ順はシートのタブ順に依存する
- 非表示シートを含める場合は、Visibleを一時的に表示に変えてから選択する
ミニQA:結合後のページ順が崩れるのはなぜ?
- シートの並びが想定と違う、または非表示シートを含んだ/除いたことで順序が変わることが多いです。印刷の順番は基本的にタブ順で決まるため、出力前に並び替えを確認します。印刷範囲や改ページの設定違いでも、総ページ数が想定より増えて順序がずれて見える場合があります。
すべてのシートを個別のPDFファイルとして出力
各シートをそれぞれ別々のPDFに書き出す方法です。大量の帳票を一度にファイル化したいときに便利です。ファイル名の重複や使用禁止文字、長すぎる名前に注意し、進捗表示を入れると運用が楽になります。
サンプルコード(個別PDF)
Option Explicit
Public Sub ExportEachSheetAsPdf()
Dim wb As Workbook
Dim ws As Worksheet
Dim baseDir As String
Dim fname As String
Dim i As Long, n As Long
Set wb = ThisWorkbook
baseDir = wb.Path & Application.PathSeparator & “pdf_out”
If Dir(baseDir, vbDirectory) = vbNullString Then
MkDir baseDir
End If
Application.ScreenUpdating = False
Application.DisplayAlerts = False
On Error GoTo CleanFail
n = CountExportableSheets(wb)
For Each ws In wb.Worksheets
If ws.Visible = xlSheetVisible Then
i = i + 1
Application.StatusBar = “PDF出力中 ” & i & “/” & n & ” : ” & ws.Name
fname = SanitizeFileName(ws.Name)
If Len(fname) > 180 Then fname = Left$(fname, 180) ‘パス長対策
ws.ExportAsFixedFormat _
Type:=xlTypePDF, _
Filename:=baseDir & Application.PathSeparator & Format$(i, “000_”) & fname & “.pdf”, _
Quality:=xlQualityStandard, _
IncludeDocProperties:=True, _
IgnorePrintAreas:=False, _
OpenAfterPublish:=False
End If
Next ws
MsgBox “個別PDFの出力が完了しました。保存先: ” & baseDir, vbInformation
CleanExit:
Application.StatusBar = False
Application.DisplayAlerts = True
Application.ScreenUpdating = True
Exit Sub
CleanFail:
MsgBox “出力中にエラーが発生しました。” & vbCrLf & Err.Number & “: ” & Err.Description, vbCritical
Resume CleanExit
End Sub
Private Function CountExportableSheets(ByVal wb As Workbook) As Long
Dim c As Long, ws As Worksheet
For Each ws In wb.Worksheets
If ws.Visible = xlSheetVisible Then c = c + 1
Next ws
CountExportableSheets = c
End Function
Private Function SanitizeFileName(ByVal s As String) As String
‘Windowsで使えない文字を安全な文字に置換
Dim bad As Variant, rep As Variant, i As Long
bad = Array(“\\”, “/”, “:”, “*”, “?”, “\””, “<“, “>”, “|”)
rep = Array(“_”, “_”, “_”, “_”, “_”, “‘”, “_”, “_”, “_”)
For i = LBound(bad) To UBound(bad)
s = Replace$(s, bad(i), rep(i))
Next i
s = Trim$(s)
If Len(s) = 0 Then s = “sheet”
SanitizeFileName = s
End Function
命名規則テンプレ
- 連番_シート名.pdf(例: 001_売上集計.pdf)
- 日付_シート名.pdf(例: 2025-11-10_請求書.pdf)
- 連番_カテゴリ_シート名.pdf(例: 010_東日本_拠点別実績.pdf)
よくある落とし穴
- シート名に使用不可文字が含まれる(置換してから保存)
- 同名ファイルが既にある(上書き可否を事前に決める)
- OneDrive/SharePoint 配下では同期が遅れ、二重出力に見えることがある
ミニQA:特定シートだけ出力から外すには?
- ワークシートをループする際に、名前やインデックスで条件分岐します。例えば「テンプレ」「集計」など除外キーワードを配列で持ち、該当すればスキップする方法が実務では簡単です。
コードのポイント解説
実務で長く使うなら、読みやすさと保守性が重要です。最低限の(1)宣言、(2)分割、(3)エラー処理、(4)速度配慮の4点を押さえます。
基本方針
- Option Explicitで変数を必ず宣言
- 共通処理(ファイル名サニタイズ等)は関数化
- 失敗に備えて後始末(画面更新・アラートの復帰)は必ず書く
- ループ時はStatusBarで進捗を表示し、ユーザーの不安を減らす
構成例(Main/Helper/Config)
- Main:処理の入口。保存先やフラグを決定して呼び出す
- Helper:サニタイズ、可視シート数カウントなどの小粒関数
- Config:命名規則、品質設定(標準/最小)などの定数置き場
‘Config例
Public Enum PdfQuality
PdfStd = xlQualityStandard
PdfMin = xlQualityMinimum
End Enum
Public Const OPEN_AFTER As Boolean = False
Public Const IGNORE_PRINT_AREA As Boolean = False
速度を上げる小ワザ
- ScreenUpdatingやCalculationの制御(必要な範囲で)
- 印刷範囲と改ページの事前確定(自動改ページの揺れを減らす)
- ループ内での選択/アクティブ化を避け、オブジェクト変数で直接操作
エラー処理の最小テンプレ
On Error GoTo ErrHand
‘…処理…
GoTo Finally
ErrHand:
MsgBox Err.Number & “: ” & Err.Description, vbCritical
Finally:
‘後始末(画面更新やアラート復帰など)
ミニQA:速度を上げる簡単な設定は?
- ScreenUpdatingをFalseにし、選択/Activateを使わないだけでも体感が変わります。計算方式が自動のブックでは、重いシートを大量出力する前に計算を済ませておくとさらに安定します。
ExportAsFixedFormatのパラメータ解説
ExportAsFixedFormatはPDF出力の中核です。主要パラメータの意味と使いどころを整理します。
主なパラメータ
| パラメータ | 意味 | 既定 | よく使う値/備考 |
|---|---|---|---|
| Type | 出力形式 | 必須 | xlTypePDF を指定 |
| Filename | 保存パス | なし | 拡張子.pdf を付ける |
| Quality | 画質/圧縮 | xlQualityStandard | 最小化なら xlQualityMinimum |
| IncludeDocProperties | 文書プロパティを含む | True | 監査用途で有効 |
| IgnorePrintAreas | 印刷範囲を無視 | False | Trueだとシート全体が対象 |
| From / To | ページ範囲 | 省略 | 特定ページだけ出力に使う |
| OpenAfterPublish | 出力後に開く | False | 運用ではFalseが無難 |
| FixedFormatExtClassPtr | 拡張(通常未使用) | 省略 | 触らないでOK |
推奨セットの例
- 品質優先:Quality=xlQualityStandard、IncludeDocProperties=True、IgnorePrintAreas=False
- サイズ優先:Quality=xlQualityMinimum、IncludeDocProperties=False、画像の解像度は印刷設定側で抑える
ミニQA:画質を保ちつつサイズを抑える組み合わせは?
- QualityはStandardのまま、印刷範囲を適切に設定し、不要な画像を削除するのが近道です。画像が多い帳票は、用紙サイズ・向き・余白を統一してページ数を減らすだけでもサイズ削減につながります。
実装時の注意点
出力自体は簡単でも、現場では印刷設定や保存先の事情で失敗が起こりやすいです。事前チェックでトラブルを減らしましょう。
チェックリスト
- 印刷範囲が未設定/重複していないか
- 列幅/行高の自動調整で改ページが想定外になっていないか
- ページ向き(縦/横)と用紙サイズ(A4等)が混在していないか
- 余白が極端に狭くないか(プリンタ定義の影響を受ける)
- OneDrive/SharePoint/ネットワークフォルダーで同期・権限に問題がないか
- 長すぎるパス(概ね260文字目安)になっていないか
失敗例と回避
- 「印刷範囲なし」で全セルが出力される → PrintAreaを設定、またはIgnorePrintAreas=Falseを徹底
- フォルダーに書き込み権限がない → ローカルに一度保存してから移動
- ファイルが既に開かれている → 別名保存に切り替える、またはプロセスを閉じる
ミニQA:保存に失敗した時の最低限の切り分けは?
- まず保存先をローカルの短いパスに変更します。次に空の新規ブックで1シートだけ出力し、環境依存かブック依存かを切り分けます。これで多くの原因(パス長、権限、ブックの壊れ)が見えてきます。
付録:主な印刷設定と効果(まとめ表)
よく使う印刷設定と効果を一覧で確認できます。
| 項目 | 目的 | 代表的な設定例 |
|---|---|---|
| 印刷範囲 | 出力領域の固定 | 必要範囲を選択して設定 |
| 余白 | 文字の切れと見栄え | 普通、狭い等を統一 |
| 向き | ページの縦横 | 縦固定 or 横固定 |
| 用紙サイズ | ページサイズの統一 | A4固定が扱いやすい |
| 拡大/縮小 | ページ分割の安定 | 1ページに収める 等 |