エクセルVBAで一部のワークシートのみ選択してPDFで出力する方法


みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

エクセルVBAでPDF出力や印刷をする際のテクニックについてお伝えしています。

前回はこちらの記事でした。

エクセルVBAで全てのシートを一つのPDFにまとめて出力する方法
エクセルVBAでPDF出力や印刷をする際のテクニックについて引き続きお伝えしていきますが、今回はエクセルVBAで全てのシートをまとめてプレビューまたはPDF出力をする方法についてお伝えします。

エクセルVBAですべてのワークシートをまとめてプレビューまたはPDF出力する方法についてお伝えしました。

これはこれで便利なのですが、一部のシートは出力しなくてもいい、というときはどうしましょうか?

今回は、エクセルVBAで一部のシートのみプレビューまたはPDF出力する方法についてお伝えをしますね。

では、行ってみましょう!

スポンサーリンク

前回のおさらい:全てのシートをPDF出力する

では、前回紹介したプログラム、全てのシートをPDF出力するVBAプログラムについておさらいをしましょう。

こちらです!

Sub outputPDF()

Dim fileName As String '保存先フォルダパス&ファイル名
fileName = ThisWorkbook.Path & "\201604請求書_株式会社ホゲホゲ御中.pdf"

Dim ws As Worksheet
For Each ws In Worksheets

    With ws.PageSetup

        .Zoom = False
        .FitToPagesWide = 1
        .FitToPagesTall = 1
        .CenterHorizontally = True
        .TopMargin = Application.CentimetersToPoints(1)
        .BottomMargin = Application.CentimetersToPoints(1)

    End With

Next ws

Worksheets.Select
ActiveWorkbook.PrintPreview
'ActiveWorkbook.ExportAsFixedFormat Type:=xlTypePDF, fileName:=fileName '選択したシートをPDF出力

End Sub

まず、7~20行目ですが、For Each分で作業中のワークブックの全てのワークシートについて繰り返しを行っています。

そしてその繰り返し内の処理の中身といいますと、9~18行目でPageSetupオブジェクトで出力に関する各種設定を行っているということになります。

22行目で全てのシートを選択した状態にしつつ、23行目でプレビューをするということになります。

複数のシートをプレビューまたはPDF出力をする場合は、対象となるシートを全て選択した上で、ワークブックに対してメソッドを実行するんだったんですよね。

一部のシートは出力したくない

では、このような場合はどうでしょうか。

出力しないシートも含まれている

シートが3つありまして、「請求書①」「請求書②」は出力したいのですが、「Sheet1」は出力したくないのです。

こういうケースも結構ありますよね。

計算途中のためのシートだったり、元データを格納するシートだったりします。

前回のプログラムで言うところの「すべてのシートを選択してワークブックに対してメソッド」の部分を「一部のシートを選択してワークブックに対してメソッド」とすればOKなんですよ。

では具体的なプログラムをお見せしていきましょう。

一部のシートのみプレビューまたはPDF出力するVBAプログラム

ワークブック内の一部のシートのみプレビューまたはPDF出力するVBAプログラムはこちらです。

Sub outputPDF()

Dim fileName As String '保存先フォルダパス&ファイル名
fileName = ThisWorkbook.Path & "\201604請求書_株式会社ホゲホゲ御中.pdf"

Dim ws As Worksheet
For Each ws In Worksheets(Array("請求書①", "請求書②"))

    With ws.PageSetup

        .Zoom = False
        .FitToPagesWide = 1
        .FitToPagesTall = 1
        .CenterHorizontally = True
        .TopMargin = Application.CentimetersToPoints(1)
        .BottomMargin = Application.CentimetersToPoints(1)

    End With

Next ws

Worksheets(Array("請求書①", "請求書②")).Select
ActiveWorkbook.PrintPreview
'ActiveWorkbook.ExportAsFixedFormat Type:=xlTypePDF, fileName:=fileName '選択したシートをPDF出力

End Sub

前回のプログラムと変わったのは7行目、そして22行目のたった2行です。

よく前回のプログラムと比較してみますと、その2行とも共通で

Workseets

Worksheets(Array(“請求書①”, “請求書②”))

に置き換わっただけ、というのはおわかりになりますでしょうか?

Array関数で配列を作る

まずArray関数ですが、配列を表すための関数です。

Array(値1,値2,…)

は、値1,値2,…からなる配列を表します。

例えば、Array(“請求書①”, “請求書②”)は、請求書①と請求書②という二つの文字列が格納された配列を表すということです。

Array関数で複数のワークシートの集まりを表現

さらにこのArray関数を使って

Worksheets(シート名の配列)

とすることで、シート名の配列に格納された全てのシート名からなるワークシートの集まりを指すことができます。

シート名の配列は具体的にはArray(“請求書①”, “請求書②”)と表すことができますから、Worksheets(Array(“請求書①”, “請求書②”))は請求書①と請求書②の二つのシートからなる集まりを表現しているということになります。

ですから

For Each ws In Worksheets(Array("請求書①", "請求書②"))
     ’処理
Next ws

は請求書①と請求書②の二つのシートについて処理を繰り返すということですし

Worksheets(Array("請求書①", "請求書②")).Select

は、請求書①と請求書②の二つのシートを選択する、という命令になります。

実行結果

このプログラムを実行すると

一部のシートのみプレビュー

指定した2ページ(2シート)のみプレビューがされていますし、シートの状態を見ると

一部のシートのみ選択

請求書①と請求書②のシートのみ選択され、Sheet1は選択されていないということがわかります。

まとめ

以上、エクセルVBAで一部のシートのみプレビューまたはPDF出力する方法についてお伝えしました。

今回紹介しましたArray関数による配列でワークシートの集まりを表現する方法は、その他の様々なオブジェクトの集まりを作ることに応用ができまして、とっても便利です。

ぜひ機会があれば活用してみて下さいね。

エクセルVBAによる印刷設定&PDF出力についてのシリーズは今回でいったん終了です。

また便利な機能を見つけては紹介していきますね。お楽しみに!

連載目次:エクセルVBAでPDF出力と色々な印刷設定

エクセルで見積書や請求書などの帳票を作成する場合、印刷やPDF出力したいときがありますよね。このシリーズでは印刷やPDF出力をする方法、またその際の様々な設定やテクニックについてお伝えします。
  1. 初心者でも簡単!エクセルVBAでPDFを出力する最もシンプルなプログラム
  2. エクセルVBAで印刷時のページ中央配置と余白を設定する
  3. エクセルVBAで印刷範囲の設定をする方法とクリアをする方法
  4. エクセルVBAで印刷時のヘッダー・フッターの設定をする方法と書式コード・VBAコード一覧
  5. エクセルVBAで全てのシートを一つのPDFにまとめて出力する方法
  6. エクセルVBAで一部のワークシートのみ選択してPDFで出力する方法

コメント

  1. symd より:

    大変参考にさせていただきました。

    ありがとうございます。
    1点、コメントアウト欄の記述についてですが、

    >’ActiveWorkbook.ExportAsFixedFormat Type:=
    この部分について、正しくは

    ActiveSheet.Ex~

    ではないでしょうか。

    • symdさん

      コメントありがとうございます。
      コメントアウト内ですが、WorkbookオブジェクトのメンバーにもExportAsFixedFormatメソッドは存在しておりますので、問題なく動作すると思います。
      よろしければ試してみてくださいませ。

タイトルとURLをコピーしました