【VBA】非表示ではないシートのみを一括で印刷する方法

スポンサーリンク

Excel 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では頻繁に使うので知っておくと大変便利だと思います。

コメント

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