【VBA】Excelでシート等をPDF出力する方法(サンプルコード)

Excelで印刷するのと同じような感覚でPDF出力するサンプルコードを掲載します。

もともとExcelでは「名前を付けて保存」からPDF形式を選んで保存することでPDFファイルの出力ができます。

それでも、やはりボタンひとつで特定のシートを出力したり、ブックすべてのシートを一括で出力できる仕組みはとても便利です。

名前を付けて保存から出力するよりアクション数を減らせるだけでなく、どのフォルダへどういった名前で出力するかも指定しておけるので、複数ユーザーが使う場合でも運用を統一できます。

何より、短いコードをコピペするだけなので、実装するのも簡単です。

サンプルコードはいくつかのバリエーションを用意しましたので、目的に近いものがあればぜひ取り入れてみてください。

目次

PDF出力するメソッド

コピペといっても、出力するシートや出力するフォルダ等、最低限の部分変更は必要なので、カスタマイズのポイントがわかるように基本的な構成等を記載しておきます。

構成(ExportAsFixedFormatメソッド)

よく使う基本的なパターンは次のような感じです。

基本的な構成
 Sub 基本的な構成()
   対象シート等の指定.ExportAsFixedFormat Type:=xlTypePDF, Filename:="出力するPDFファイルのフルパス.pdf"
 End Sub 

次に、省略可能なすべての引数を省略したのが次の型です。

最小構成
Sub 最小構成()
   対象シート等の指定.ExportAsFixedFormat Type:=xlTypePDF
End Sub 

最小構成の場合、出力先を指定していないので、VBAを動かしているブックと同じフォルダに、「ブック名.pdf」というファイル名で出力されます。

実際にはこの2パターンだけ覚えておけば困ることはそうないでしょう。

一応、引数をすべて書くと次のようになります。

対象シート等の指定.ExportAsFixedFormat _
  Type:=出力形式, _
  Filename:=出力ファイルのフルパス, _
  Quality:=品質設定, _
  IncludeDocProperties:=文書のプロパティ情報, _
  IgnorePrintAreas:=印刷範囲の利用, _
  From:=開始ページ, _
  To:=終了ページ, _
  OpenAfterPublish:=出力後の表示, _
  FixedFormatExtClassPtr:=FixedFormatExtクラスへのポインター

長いですね、正直あまり知らなくていいと思います。

これらの引数は次の項目で設定値などを一覧にしています。興味なければ飛ばしてください。

引数の概要

それぞれの引数については次の表に概要を挙げておきます。

引数概要指定値
Type出力形式PDF:xlTypePDF
XPS:xlTypeXPS
Filename出力ファイル名フルパスで指定
※既定値:ブックパス&ファイル名
Quality画質標準:xlQualityStandard
最小:xlQualityMinimum
※既定値:標準
IncludeDocProperties文書プロパティ残す:True、残さない:False
※既定値:False
IgnorePrintAreas印刷範囲無視:True、有効:False
※既定値:False
From開始ページページ番号で指定
※既定値:1
To終了ページページ番号で指定
※既定値:最終ページ
OpenAfterPublish出力後の表示表示:True、何もしない:False
※既定値:False
FixedFormatExtClassPtrFixedFormatExt クラスへのポインター

FixedFormatExtClassPtrについて

私はこの引数を使ったことがなく、この記事を書くにあたり調べたものの、あまり情報がありませんでした。

たいていのページでは次のように説明されています。どれもMicrosoftのページのコピーですね。

ブックを別の固定形式で保存できるようにする
IMsoDocExporterインターフェイスの実装へのポインター

また、Microsoftのページでは次のような説明もあったので、恐らく外部ソフト等との連携のために存在する引数のようにも見えます。ただし、引数の値をどのように指定するかなどは結局わかりませんでした。

Officeの拡張(2007)固定形式のエクスポート機能
Microsoft Office Publisher2007などの2007Microsoft Officeリリースのアプリケーション用のCOMアドインを作成します。これは、Officeの固定形式のエクスポート機能を拡張して新しい形式をサポートします。説明されている手法には、C ++とCOMの知識が必要です。

サンプルコード

ExportAsFixedFormatメソッドの注意点として、ファイルを出力した際、出力先に同じ名前(&拡張子)のファイルがあると警告なしで上書きしてしまいます。

そのため、ここで紹介しているサンプルコードは、出力ファイル名(Filename)に、日時分までを付与するようにしています。(不要な場合は「Format(Now, “mmdd-hhmm”) & “_” &」という部分を削除してください。)

アクティブシートのみPDF出力

Sub PDF出力1()
    ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, _
    Filename:=ThisWorkbook.Path & "\" & Format(Now, "mmdd-hhmm") & "_" & ActiveSheet.Name & ".pdf"
End Sub

実行すると、アクティブシートを、実行ブックがあるフォルダにPDF出力します。

出力ファイル名は出力したシート名になります。

特に変更なしでも使えるコードですので、適当な標準モジュールに貼り付けて試してみてください。

運用では出力したいシートにボタンを用意して、そのボタンから実行することで表示中のシートをPDF出力できます。

アクティブシートのみPDF出力(実行確認付き)

Sub PDF出力2()

    '実行確認
    If MsgBox("PDF形式で出力します。よろしいですか?", vbQuestion + vbYesNo) = vbNo Then
        MsgBox "中止しました。"
        Exit Sub
    End If
   
    '出力処理
    ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, _
    Filename:=ThisWorkbook.Path & "\" & Format(Now, "mmdd-hhmm") & "_" & ActiveSheet.Name & ".pdf"

End Sub

先のコードに実行確認を付けただけです。

以下のコードにはすべて付けています。

対象シートを指定してPDF出力

Sub PDF出力3()

    '対象シート名
    Dim ShName As String
    ShName = "Sheet1"
    
    '実行確認
    If MsgBox(ShName & "シートをPDF形式で出力します。よろしいですか?", vbQuestion + vbYesNo) = vbNo Then
        MsgBox "中止しました。"
        Exit Sub
    End If
   
    '出力処理
    Sheets(ShName).ExportAsFixedFormat Type:=xlTypePDF, _
    Filename:=ThisWorkbook.Path & "\" & Format(Now, "mmdd-hhmm") & "_" & Sheets(ShName).Name & ".pdf"

End Sub

次の赤字部分を出力したいシートの名前にすることで、そのシートを出力できます。

ShName = “Sheet1

全シートを1つにまとめてPDF出力

Sub PDF出力4()

    '実行確認
    If MsgBox("PDF形式で出力します。よろしいですか?", vbQuestion + vbYesNo) = vbNo Then
        MsgBox "中止しました。"
        Exit Sub
    End If
   
    '出力処理
    ThisWorkbook.ExportAsFixedFormat Type:=xlTypePDF, _
    Filename:=ThisWorkbook.Path & "\" & Format(Now, "mmdd-hhmm") & "_" & ThisWorkbook.Name & ".pdf"

End Sub

ブック内のすべてのシートを1つのPDFファイル内に連結して出力します。

出力したファイルの名前はブック名になります。

全シートをシートごとにPDF出力

Sub PDF出力5()

    '実行確認
    If MsgBox("PDF形式で出力します。よろしいですか?", vbQuestion + vbYesNo) = vbNo Then
        MsgBox "中止しました。"
        Exit Sub
    End If
   
    '出力処理
    Dim WS As Worksheet
    For Each WS In Worksheets
        WS.ExportAsFixedFormat Type:=xlTypePDF, _
        Filename:=ThisWorkbook.Path & "\" & Format(Now, "mmdd-hhmm") & "_" & WS.Name & ".pdf"
    Next

End Sub

ブック内の全シートをシート別にファイルを分けて出力します。

出力したファイルの名前は各シート名になります。

指定したシート範囲をシートごとにPDF出力

Sub PDF出力6()

    '対象シート
    Dim SttSh As Long
    Dim EndSh As Long
    SttSh = 1 '開始シート№(インデックス№)
    EndSh = 3 '終了シート№(インデックス№)
           
    'シート数確認
    Dim ShCnt As Long
    ShCnt = Sheets.Count
    
    '整合性判定
    If SttSh > ShCnt Or EndSh > ShCnt Then
        MsgBox "出力範囲がシート数を超えています。", vbExclamation
        Exit Sub
    ElseIf SttSh > EndSh Then
        MsgBox "開始シート№は終了シート№より小さくなるように指定してください。", vbExclamation
        Exit Sub
    End If

    '実行確認
    If MsgBox("シート№" & SttSh & "~" & EndSh & "までをPDF形式で出力します。" & vbCrLf & _
              "よろしいですか?", vbQuestion + vbYesNo) = vbNo Then
        MsgBox "中止しました。"
        Exit Sub
    End If
   
    '出力処理
    Dim i As Long
    For i = SttSh To EndSh
        Sheets(i).ExportAsFixedFormat Type:=xlTypePDF, _
        Filename:=ThisWorkbook.Path & "\" & Format(Now, "mmdd-hhmm") & "_" & Sheets(i).Name & ".pdf"
    Next

End Sub

任意のシートの範囲(1枚目~3枚目など)を出力します。

次の数値を変更することで、出力範囲を変更できます。

SttSh = 1 ‘開始シート№(インデックス№)
EndSh = 3 ‘終了シート№(インデックス№)

整合性判定の部分では、上記で指定した数値が正しいか判断しています。具体的には、①シート総数を超える値が指定されていないか、②開始№が終了№より大きくなっていないか、です。

指定した非連続シートをシート別にPDF出力

Sub PDF出力7()
    
    '対象シートの指定
    Dim Arr As Variant
    Arr = Array(1, 3) 'シートのIndex番号を指定
    
    'エラー発生時のスキップ
    On Error GoTo Err
           
    '実行確認
    If MsgBox("PDF形式で出力します。よろしいですか?", vbQuestion + vbYesNo) = vbNo Then
        MsgBox "中止しました。"
        Exit Sub
    End If
   
    '出力処理
    Dim WS As Worksheet
    For Each WS In Sheets(Arr)
        WS.ExportAsFixedFormat Type:=xlTypePDF, _
        Filename:=ThisWorkbook.Path & "\" & Format(Now, "mmdd-hhmm") & "_" & WS.Name & ".pdf"
    Next
    Exit Sub

Err: 'エラー発生時のスキップ先
MsgBox "指定が正しくないため中断します。", vbExclamation

End Sub

このコードでは任意の非連続シート(1枚目と3枚目)を出力します。

対象シートは次のようにシートのインデックス№(左から何番目のシートか)をカンマで区切って指定しているので、出力シートを変更するときはこの数値を変更してください。

Arr = Array(1, 3)

もちろん、インデックス№ではなくシート名で指定することも可能です。

その場合は次のように指定しましょう。シート名は””で囲うのがお約束です。

Arr = Array(“シート1”, “シート3”)

なお、このサンプルコードでは整合性判定を行う代わりに、エラーが発生した場合にErr:まで処理をスキップして強制終了させるようにしています。(存在しないシート№が指定された場合などのエラー回避)

まとめ

掲載したサンプルコードはすべてVBAを実行しているブックのある場所(ThisWorkbook.Path)に出力するようにしています。

出力先フォルダを変える場合はThisWorkbook.Path“C:\フォルダ”のように変更すればいいだけです。

また、引数について、サンプルコードでは主にFilenameしか紹介していませんが、次の引数は意外と使う可能性があると思います。必要性を感じた方は再度構成をチェックしてみてください。

  • Quality 品質設定
  • From 開始ページ
  • To 終了ページ
  • OpenAfterPublish 出力後の表示

以上、PDF出力する方法でした。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次