みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
エクセル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出力についてのシリーズは今回でいったん終了です。
また便利な機能を見つけては紹介していきますね。お楽しみに!
コメント
大変参考にさせていただきました。
ありがとうございます。
1点、コメントアウト欄の記述についてですが、
>’ActiveWorkbook.ExportAsFixedFormat Type:=
この部分について、正しくは
ActiveSheet.Ex~
ではないでしょうか。
symdさん
コメントありがとうございます。
コメントアウト内ですが、WorkbookオブジェクトのメンバーにもExportAsFixedFormatメソッドは存在しておりますので、問題なく動作すると思います。
よろしければ試してみてくださいませ。