Excel VBA|複数シート印刷で特定のシートを除外する方法

スポンサーリンク
この記事は約15分で読めます。

Excel VBAで複数のシートを一括印刷するとき、作業用シートやデータシートまで印刷されてしまうことがあります。

この記事では、印刷したくないシート名をあらかじめリスト化し、そのシートだけを印刷対象から除外する方法を紹介します。

前回作成した「印刷プレビューと自動印刷を選べるマクロ」に、除外シートの設定を追加する応用編です。

このマクロでできること

  • 印刷したくないシートを指定できる。
  • 「データ1」「データ2」「データ3」などの作業用シートを除外できる。
  • 除外リストに含まれるシートは印刷処理をスキップする。
  • それ以外のシートだけを印刷対象にする。
  • 印刷プレビューまたは自動印刷を選択できる。

今回追加する除外シート設定

今回のポイントは、印刷したくないシート名を配列に入れておくことです。

excludeSheets = Array("データ1", "データ2", "データ3")

このように指定しておくと、マクロ実行時に「データ1」「データ2」「データ3」は印刷対象から外されます。

シート名 処理
データ1 印刷しない
データ2 印刷しない
データ3 印刷しない
その他の帳票シート 条件に合えば印刷する

このマクロで行う処理

  1. 印刷方法を選択する。
  2. 印刷から除外するシート名を配列に登録する。
  3. データシートから対象となる店番コードを取得する。
  4. すべてのワークシートを順番に確認する。
  5. 除外リストに含まれるシートはスキップする。
  6. 対象シートのB2またはC4に店番コードがあるか確認する。
  7. 条件に合うシートだけを印刷する。

VBAコード

以下が、印刷しないシートを指定して、対象シートだけを印刷するマクロです。

Sub PrintSheetsWithFukuokaShops_ExcludeSheets()

    Dim ws As Worksheet
    Dim dataSheet As Worksheet
    Dim fukuokaShops As Object
    Dim cell As Range
    
    Dim password As String
    Dim shopCode As Variant
    Dim printRange As Range
    Dim confirmPrint As VbMsgBoxResult
    
    Dim excludeSheets As Variant
    
    On Error GoTo ErrHandler
    
    '=== 印刷方法を選択 ===
    confirmPrint = MsgBox( _
        "印刷方法を選択してください。" & vbCrLf & _
        "はい:自動印刷" & vbCrLf & _
        "いいえ:印刷プレビュー" & vbCrLf & _
        "キャンセル:処理中止", _
        vbYesNoCancel + vbQuestion, _
        "印刷方法の選択" _
    )
    
    If confirmPrint = vbCancel Then
        MsgBox "印刷処理を中止しました。", vbInformation
        Exit Sub
    End If
    
    '=== 除外するシート名を指定 ===
    excludeSheets = Array("データ1", "データ2", "データ3")
    
    '=== データシートを指定 ===
    Set dataSheet = ThisWorkbook.Sheets("データシート")
    
    '=== 福岡の店番コードを格納するDictionary ===
    Set fukuokaShops = CreateObject("Scripting.Dictionary")
    
    '=== シート保護解除用パスワード ===
    password = "1234"
    
    '=== データシートのC列を確認し、「福岡」の店番コードを取得 ===
    For Each cell In dataSheet.Range("C1:C" & dataSheet.Cells(dataSheet.Rows.Count, 3).End(xlUp).Row)
    
        If cell.Value = "福岡" Then
        
            shopCode = cell.Offset(0, -2).Value
            
            If Len(Trim(CStr(shopCode))) > 0 Then
                If Not fukuokaShops.Exists(CStr(shopCode)) Then
                    fukuokaShops.Add CStr(shopCode), True
                End If
            End If
        
        End If
    
    Next cell
    
    '=== 各シートを確認 ===
    For Each ws In ThisWorkbook.Worksheets
    
        ' 除外リストに含まれるシートはスキップ
        If IsSheetExcluded(ws.Name, excludeSheets) Then
            GoTo NextSheet
        End If
        
        Set printRange = Nothing
        
        ' シート保護がある場合は解除
        If ws.ProtectContents Then
            On Error Resume Next
            ws.Unprotect Password:=password
            
            If Err.Number <> 0 Then
                MsgBox "シート '" & ws.Name & "' の保護を解除できませんでした。", vbExclamation
                Err.Clear
                On Error GoTo ErrHandler
                GoTo NextSheet
            End If
            
            On Error GoTo ErrHandler
        End If
        
        ' B2に店番コードがある場合
        If Len(Trim(CStr(ws.Range("B2").Value))) > 0 Then
        
            shopCode = CStr(ws.Range("B2").Value)
            
            If fukuokaShops.Exists(shopCode) Then
                Set printRange = ws.Range("A1:T60")
                Call FormatAndPrintSheet_Type1(ws, printRange, confirmPrint)
            End If
        
        End If
        
        ' C4に店番コードがある場合
        If Len(Trim(CStr(ws.Range("C4").Value))) > 0 Then
        
            shopCode = CStr(ws.Range("C4").Value)
            
            If fukuokaShops.Exists(shopCode) Then
                Set printRange = ws.Range("A1:M46")
                Call FormatAndPrintSheet_Type2(ws, printRange, confirmPrint)
            End If
        
        End If
        
NextSheet:
    Next ws
    
    MsgBox "条件に合うシートの印刷処理が完了しました。", vbInformation
    Exit Sub

ErrHandler:
    MsgBox "エラーが発生しました:" & Err.Description, vbExclamation

End Sub


'----------------------------------------------------------
' 除外シートかどうかを判定する関数
'----------------------------------------------------------
Private Function IsSheetExcluded(ByVal sheetName As String, ByVal excludeSheets As Variant) As Boolean

    Dim i As Long
    
    For i = LBound(excludeSheets) To UBound(excludeSheets)
        If sheetName = excludeSheets(i) Then
            IsSheetExcluded = True
            Exit Function
        End If
    Next i
    
    IsSheetExcluded = False

End Function


'----------------------------------------------------------
' 書式①:B2に店番コードがあるシート用
'----------------------------------------------------------
Sub FormatAndPrintSheet_Type1(ws As Worksheet, printRange As Range, confirmPrint As VbMsgBoxResult)

    With printRange
        .Font.Name = "Arial"
        .Font.Size = 12
        .Font.Bold = True
        .HorizontalAlignment = xlCenter
        .VerticalAlignment = xlCenter
        .Interior.Color = RGB(200, 200, 255)
    End With
    
    With ws.PageSetup
        .PrintArea = printRange.Address
        .LeftMargin = Application.InchesToPoints(0.5)
        .RightMargin = Application.InchesToPoints(0.5)
        .TopMargin = Application.InchesToPoints(0.75)
        .BottomMargin = Application.InchesToPoints(0.75)
        .CenterHorizontally = True
        .CenterVertically = True
    End With
    
    Call ExecutePrintMode(ws, confirmPrint)

End Sub


'----------------------------------------------------------
' 書式②:C4に店番コードがあるシート用
'----------------------------------------------------------
Sub FormatAndPrintSheet_Type2(ws As Worksheet, printRange As Range, confirmPrint As VbMsgBoxResult)

    With printRange
        .Font.Name = "Calibri"
        .Font.Size = 10
        .Font.Italic = True
        .HorizontalAlignment = xlLeft
        .VerticalAlignment = xlTop
        .Interior.Color = RGB(255, 255, 200)
    End With
    
    With ws.PageSetup
        .PrintArea = printRange.Address
        .LeftMargin = Application.InchesToPoints(0.3)
        .RightMargin = Application.InchesToPoints(0.3)
        .TopMargin = Application.InchesToPoints(0.5)
        .BottomMargin = Application.InchesToPoints(0.5)
        .CenterHorizontally = False
        .CenterVertically = False
    End With
    
    Call ExecutePrintMode(ws, confirmPrint)

End Sub


'----------------------------------------------------------
' 印刷方法を実行する共通処理
'----------------------------------------------------------
Sub ExecutePrintMode(ws As Worksheet, confirmPrint As VbMsgBoxResult)

    If confirmPrint = vbYes Then
        ws.PrintOut
    ElseIf confirmPrint = vbNo Then
        ws.PrintPreview
    End If

End Sub

コードのポイント

除外するシート名を配列で指定する

印刷したくないシートは、次の部分で指定します。

excludeSheets = Array("データ1", "データ2", "データ3")

除外したいシートを増やしたい場合は、配列の中にシート名を追加します。

excludeSheets = Array("データ1", "データ2", "データ3", "集計", "作業用")

除外判定を関数に分ける

現在のシートが除外対象かどうかは、IsSheetExcluded 関数で判定しています。

If IsSheetExcluded(ws.Name, excludeSheets) Then
    GoTo NextSheet
End If

このように関数に分けることで、メイン処理が読みやすくなります。

iは配列を順番に確認するための変数

i は、除外シート名が入っている配列 excludeSheets を順番に確認するための変数です。

現在のシート名が除外リストに含まれていれば、そのシートの印刷処理をスキップします。

カスタマイズのポイント

変更したい内容 修正する場所
除外するシートを増やしたい excludeSheets の配列にシート名を追加する。
対象地域を変更したい "福岡""大阪" などに変更する。
印刷範囲を変更したい A1:T60 または A1:M46 を変更する。
印刷方法を変更したい ExecutePrintMode の中で PrintOut / PrintPreview を調整する。
注意:
除外シート名は、実際のシート名と完全に一致している必要があります。
余分なスペースや全角・半角の違いがあると、除外されずに印刷対象になる場合があります。

このページと前後の記事の違い

このページでは、印刷したくないシートを指定して、印刷対象から除外する方法を紹介しました。

前回の記事では、印刷プレビューと自動印刷をユーザーが選べるようにする方法を紹介しています。
次の記事では、印刷ではなくPDFとして出力する方法を紹介します。

記事 内容
基本編 条件に合う複数シートを2種類の書式で印刷する。
印刷方法選択編 印刷プレビューか自動印刷をユーザーが選択できる。
この記事 印刷しないシートを指定して除外する。
PDF出力編 条件に合うシートをPDFとして出力する。

まとめ

Excel VBAで複数シートを印刷するときは、作業用シートやデータシートを除外しておくと、不要な印刷を防げます。

今回のように excludeSheets に印刷したくないシート名を登録しておけば、そのシートだけをスキップできます。

除外判定を IsSheetExcluded 関数に分けておくと、メイン処理が読みやすくなり、後から除外条件を変更しやすくなります。

コメント

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