こんにちは、Ryoです。
Excelのシートが複数あり、各シートに印刷対象が多くある場合は印刷を実行したら何枚になるのか判らなくなることや、特定のシートを除いて印刷したいことがありますよね。
VBAでこのような処理を実行したい場合、例としてどう処理するかをサンプルコードを用いて印刷枚数の取得や特定シートを除外した印刷処理などを書いてみたいと思います。
1.印刷ページ数の取得
サンプルとしてSheet1~Sheet5まであるWorkbookで、印刷対象合計が7枚あるとします。
このブックに対し「アクティブシート、及び全シートの印刷枚数を表示する」、「各シート毎に印刷枚数を取得し表示する」サンプルコードを以下に示します。
◆サンプル①「アクティブシート/全シートの印刷枚数表示」
Sub Sample1() Dim Num_A, Num_B As Long Dim Sht As Variant 'アクティブシートの印刷枚数を取得 Num_A = ActiveSheet.PageSetup.Pages.Count 'ブックの各シート印刷枚数を取得し加算 For Each Sht In Worksheets Num_B = Num_B + Sht.PageSetup.Pages.Count Next MsgBox "アクティブシートの印刷枚数は" & Num_A & "枚、" & vbCrLf _ & "ブック全体の印刷枚数は" & Num_B & "枚です。", vbInformation End Sub
手段は他にもあるのですが、本サンプルではページ設定(.PageSetup)からページを取得する方法としています。私としては一番簡単に処理できる方法ではないかと思います。
先ずアクティブシートについては、ActiveSheet.PageSetup.Pages.CountでNum_A変数に枚数を代入し、全体の印刷枚数はFor Eachを使って各シートに対し順次枚数を取得&Num_Bに加算することで全体枚数を計算させています。
アクティブシートはSheet1なので印刷枚数2枚、全体の印刷枚数は7枚と表示されています。
◆サンプル②「各シート毎に印刷枚数を取得し表示」
Sub Sample2() '各シートの印刷枚数を表示 Dim Num As Long Dim Sht As Variant Dim msg As String 'ブックの各シート印刷枚数を取得しシート名と印刷頁を連結 For Each Sht In Worksheets Num = Sht.PageSetup.Pages.Count msg = msg + Sht.Name & " = " & Num & "枚" & vbCrLf Next 'For Eachで連結した文字列をメッセージボックスで表示 MsgBox "各シートの印刷枚数は以下の通りです。" & vbCrLf _ & msg, vbInformation End Sub
こちらも基本的な方法はサンプル①と同様で、For Eachで各シートに対し順次印刷枚数を取得して変数msgに文字列として連結しています。
ここでの文字列連結はメッセージボックス表示上、見やすさを考えて改行を入れています。
個人的には一覧的な表示ができるので、用途によってはお薦めです。
このように各シートの印刷枚数が一覧表示されます。
2.特定シート以外を印刷する
特に何ともないようで実はやや面倒だったりするのが、この特定シートを除いて印刷です。
方法も色々ありますが、今回は私が主に使う場合のサンプルコードとして紹介します。
サンプルに使うブックとシートは上述の印刷枚数取得と同じものを使い、Sheet3以外を印刷する場合を書いてみます。
Sub Sample3() Dim Sht As Variant 'ブックの全シートに対する処理 For Each Sht In Worksheets 'シート名を取得し、特定シート名以外は印刷を実行 Select Case Sht.Name Case Is <> "Sheet3" Sht.PrintOut End Select Next '**シート毎に判定し印刷を実行していく形になる 'プリントスプールが別々になるので、共有プリンタでは混ざってしまう可能性あり End Sub
For EachとSelect Caseを使ってSheet3以外を印刷する処理をするもので、この記述でも印刷は実行できます。。。しかし!上にも書きました通り、各シートごとに印刷を実行していく形になる為、プリントスプールが別々=共有プリンタでは他印刷物と混ざる可能性があります。
これを回避するにはプリントスプールをまとめれば良いので、以下の形で処理します。
Sub Sample4() Dim Sht As Variant Dim ShCnt() As String Dim Cnt As Integer 'ブックの全シートに対する処理 For Each Sht In Worksheets 'シート名を取得し、特定シート名以外は印刷を実行 Select Case Sht.Name Case Is <> "Sheet3" 'ここに印刷しないシート名 Cnt = Cnt + 1 '配列の再宣言(シート数分) ReDim Preserve ShCnt(1 To Cnt) ShCnt(Cnt) = Sht.Name End Select Next Sheets(ShCnt).PrintOut End Sub
For Eachでループ処理する際に、配列に印刷対象のシート名を格納しておき、
Sheets(ShCnt).PrintOutで印刷処理を実行することで、プリントスプールをまとめます。
こうすれば他の印刷物に混ざることは無いので安心ですね。
この通り配列にはSheet3が除かれていますので、印刷実行しても除外されます。
◆(参考)・・・複数シートを除外する場合
参考までに複数シートを指定して除外する場合のサンプルコードも書いてみます。
Sub Sample5() Dim Sht As Variant Dim ShCnt() As String Dim Cnt As Integer 'ブックの全シートに対する処理 For Each Sht In Worksheets 'シート名を取得し、印刷しないシート名以外は印刷を実行 If Sht.Name <> "Sheet3" And Sht.Name <> "Sheet2" And _ Sht.Name <> "Sheet1" Then Cnt = Cnt + 1 ReDim Preserve ShCnt(1 To Cnt) ShCnt(Cnt) = Sht.Name End If Next Sheets(ShCnt).PrintOut End Sub
複数シートが対象となる場合、Select Caseはやや使いにくいのでIf文を使っています。
本サンプルはSheet1~3を除外するので、単純にIf Andで指定します。
その他の処理は同様に配列へ格納しプリントスプールをまとめて印刷を実行する形です。
この通りSheet1~3は除外されています。
除外する必要は無く、ブックの全シートが印刷したい!ということであれば。。。
Sub Sample6() 'ブックの全シートを対象に印刷を実行 ActiveWorkbook.PrintOut End Sub
これでOKです。
3.まとめ
各コードの詳細な解説は割愛しましたが、それほど複雑ではないので大丈夫かと思います。
印刷枚数の取得はオブジェクト.PageSetup.Pages.Countで取得すると簡単で確実です。
特定シートを除外して印刷処理を行う場合のポイントは、プリントスプールかなと思いますので、配列を活用するのが良いですね。
以上、印刷ページ数の取得/特定シート以外を印刷する方法についてでした!
今回の記事が何かの参考になれば幸いです。
Ryo