Excel VBAで印刷設定している、複数のシートを一括で印刷できるようにVBAを記述したのですが、
シートに非表示のシートが存在する場合はうまく印刷できなかったので少し悩みました。
調べてみた結果、各シートの表示設定をチェックして、非表示の場合は印刷対象にしなければいけないようです。
今回は非表示シート以外のシートを一括で印刷する処理を作ってみました。
ポイントは以下の通りです。
- シートの表示/非表示の判断はWorksheets(“シート名”).Visibleで出来る。
- 複数のシートを一括で印刷する場合はUBound関数で動的配列を作る。
ソース
今回は以下のように簡単な印刷ボタンを作って、ボタンを押すとプレビュー表示するかしないかを選択して印刷を行うようにしようと思います。


印刷ボタンを押したときのマクロ
'印刷ボタンクリック時
Public Sub ExcelPrintOut()
Select Case MsgBox("プレビュー画面を表示しますか?", vbYesNoCancel + vbQuestion + vbDefaultButton1, "印刷")
Case vbCancel '中止
Exit Sub
Case vbYes 'プレビューあり
PrintOut_Excel (True)
Case vbNo 'プレビュー無し印刷
PrintOut_Excel (False)
End Select
End Sub
- メッセージボックスでキャンセルを押すと、何もせずに終わる。
- メッセージボックスではいを押すと、印刷プレビューを表示する。
- メッセージボックスでいいえを押すと、ダイレクトに印刷。
はいといいえを選択したときに実行されるPrintOut_Excelは、以下の通りです。PrintOut_Excelに渡す引数がTrueの場合はプレビュー表示を行い、Falseの場合はプレビュー表示は行わずそのまま印刷します。
'シートをまとめて印刷する。
'非表示に設定されているシートは対象外にする
Sub PrintOut_Excel(ByVal Bln_preview As Boolean)
Dim mySht As Variant
Dim i As Long
For i = 1 To Worksheets.Count
If ThisWorkbook.Worksheets(i).Visible = xlSheetVisible Then
If IsEmpty(mySht) Then
ReDim mySht(0)
Else
ReDim Preserve mySht(UBound(mySht) + 1)
End If
mySht(UBound(mySht)) = ThisWorkbook.Worksheets(i).Name
End If
Next i
If Not IsEmpty(mySht) Then
'印刷をキャンセルすると1004エラーになるので無視する
On Error Resume Next
Sheets(mySht).PrintOut preview:=Bln_preview
End If
End Sub
ポイント
シートの表示/非表示の設定をチェックする
各シートが表示 or 非表示を判断するときはIf ThisWorkbook.Worksheets(i).Visible = xlSheetVisibleで判断できます。Trueの場合は表示設定でFalseの場合は非表示の設定となります。
複数のシートを一括で印刷するときは動的配列を使う
シートが一つだけの場合や、シート数やシート名が固定の場合はシート名を直接指定すれば良いですが、複数のシートを一括で印刷する場合は、シート名を配列で渡すことで一括印刷ができます。
for文でワークシート数分繰り返し処理を行い、表示設定されている場合のみUBound関数で配列を作っていきます。
ReDim Preserve
Preserveがない場合は、配列自体は作られますが配列の中身は初期化されてしまいます。Preserveは配列に格納されている値を残したまま、配列の最後の次元の要素数を変更してくれます。
最後に作成した動的配列myShtを指定してSheets(mySht).PrintOut preview:=Bln_previewとすれば、表示設定されているシートのみを印刷することができます。Bln_previewは、印刷プレビュー表示をするかしないかのフラグです。
上述でも使っているUBound関数とReDim Preserveは、VBAでは頻繁に使うので知っておくと大変便利だと思います。
コメント