次の DEMO を見にいく
Excel

Excel VBAでまとめてPDF出力:ブック全体・選択シートを自動化

k.w
\お買い物マラソン開催中/
スポンサーリンク

全シートを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印刷範囲を無視FalseTrueだとシート全体が対象
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ページに収める 等
スポンサーリンク
記事URLをコピーしました