Excel VBAで複数のシートを一括印刷するとき、作業用シートやデータシートまで印刷されてしまうことがあります。
この記事では、印刷したくないシート名をあらかじめリスト化し、そのシートだけを印刷対象から除外する方法を紹介します。
前回作成した「印刷プレビューと自動印刷を選べるマクロ」に、除外シートの設定を追加する応用編です。
このマクロでできること
- 印刷したくないシートを指定できる。
- 「データ1」「データ2」「データ3」などの作業用シートを除外できる。
- 除外リストに含まれるシートは印刷処理をスキップする。
- それ以外のシートだけを印刷対象にする。
- 印刷プレビューまたは自動印刷を選択できる。
今回追加する除外シート設定
今回のポイントは、印刷したくないシート名を配列に入れておくことです。
excludeSheets = Array("データ1", "データ2", "データ3")
このように指定しておくと、マクロ実行時に「データ1」「データ2」「データ3」は印刷対象から外されます。
| シート名 | 処理 |
|---|---|
| データ1 | 印刷しない |
| データ2 | 印刷しない |
| データ3 | 印刷しない |
| その他の帳票シート | 条件に合えば印刷する |
このマクロで行う処理
- 印刷方法を選択する。
- 印刷から除外するシート名を配列に登録する。
- データシートから対象となる店番コードを取得する。
- すべてのワークシートを順番に確認する。
- 除外リストに含まれるシートはスキップする。
- 対象シートのB2またはC4に店番コードがあるか確認する。
- 条件に合うシートだけを印刷する。
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 関数に分けておくと、メイン処理が読みやすくなり、後から除外条件を変更しやすくなります。


コメント