Excel VBAを使って、データシートに登録された条件をもとに、対象となる複数のシートだけを印刷する方法を紹介します。
今回のマクロでは、「データシート」のC列にある地域名を確認し、「福岡」に該当する店番コードを取得します。
その店番コードが各シートのB2またはC4に入力されている場合、シートごとに異なる印刷範囲と書式を設定して印刷します。
複数の帳票シートの中から、条件に合うものだけをまとめて印刷したい場合に便利です。
このマクロでできること
- データシートから対象となる店番コードを取得する。
- 各ワークシートのB2またはC4を確認する。
- 条件に合うシートだけを印刷対象にする。
- B2に店番があるシートは、書式①で印刷する。
- C4に店番があるシートは、書式②で印刷する。
- シート保護がかかっている場合は、必要に応じて保護を解除する。
事前に確認するシート構成
このマクロでは、次のようなシート構成を想定しています。
| シート名・種類 | 役割 |
|---|---|
| データシート | A列に店番コード、C列に地域名が入力されているシート。 |
| 帳票シート | B2またはC4に店番コードが入力されている印刷対象候補のシート。 |
この記事では、C列に「福岡」と入力されている行を対象にしています。
別の地域名で印刷したい場合は、コード内の "福岡" を変更してください。
このマクロで行う処理
- 「データシート」のC列から「福岡」の行を探す。
- 該当行のA列にある店番コードを取得する。
- 取得した店番コードをDictionaryに格納する。
- すべてのワークシートを順番に確認する。
- B2またはC4に店番コードがあるか確認する。
- 店番コードが一致したシートだけを印刷対象にする。
- B2の場合は書式①、C4の場合は書式②を適用する。
- 印刷プレビューを表示する。
2種類の印刷書式
このマクロでは、店番コードが入力されているセルによって印刷範囲と書式を変えています。
| 判定セル | 印刷範囲 | 主な書式 |
|---|---|---|
| B2 | A1:T60 |
Arial、12pt、太字、中央揃え、薄青背景 |
| C4 | A1:M46 |
Calibri、10pt、斜体、左上揃え、薄黄背景 |
VBAコード
以下が、条件に合う複数シートを2種類の書式で印刷するマクロです。
Sub PrintSheetsWithFukuokaShops()
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
On Error GoTo ErrHandler
'=== データシートを指定 ===
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 ws.Name <> dataSheet.Name Then
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)
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)
End If
End If
End If
NextSheet:
Next ws
MsgBox "条件に合うシートの印刷処理が完了しました。", vbInformation
Exit Sub
ErrHandler:
MsgBox "エラーが発生しました:" & Err.Description, vbExclamation
End Sub
'----------------------------------------------------------
' 書式①:B2に店番コードがあるシート用
'----------------------------------------------------------
Sub FormatAndPrintSheet_Type1(ws As Worksheet, printRange As Range)
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)
.HeaderMargin = Application.InchesToPoints(0.3)
.FooterMargin = Application.InchesToPoints(0.3)
.CenterHorizontally = True
.CenterVertically = True
End With
ws.PrintPreview
' 直接印刷したい場合は、上の行をコメントアウトして下を使います。
' ws.PrintOut
End Sub
'----------------------------------------------------------
' 書式②:C4に店番コードがあるシート用
'----------------------------------------------------------
Sub FormatAndPrintSheet_Type2(ws As Worksheet, printRange As Range)
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
ws.PrintPreview
' 直接印刷したい場合は、上の行をコメントアウトして下を使います。
' ws.PrintOut
End Sub
コードのポイント
対象となる店番コードをDictionaryに格納する
このマクロでは、C列が「福岡」の行を探し、同じ行のA列にある店番コードをDictionaryに格納しています。
If cell.Value = "福岡" Then
shopCode = cell.Offset(0, -2).Value
End If
Dictionaryを使うことで、同じ店番コードが複数回出てきても重複を防ぎやすくなります。
B2とC4で印刷書式を分ける
各シートのB2に店番コードがある場合は、A1:T60 を印刷範囲にします。
C4に店番コードがある場合は、A1:M46 を印刷範囲にします。
このように、帳票の形式が違うシートでも、条件によって印刷範囲や書式を切り替えることができます。
現在は印刷プレビューを表示する
このサンプルでは、いきなり印刷せずに PrintPreview を表示するようにしています。
ws.PrintPreview
直接印刷したい場合は、PrintPreview をコメントアウトし、PrintOut を有効にしてください。
' ws.PrintPreview
ws.PrintOut
カスタマイズのポイント
| 変更したい内容 | 修正する場所 |
|---|---|
| 対象地域を変更したい | "福岡" を "大阪" などに変更する。 |
| データシート名を変更したい | ThisWorkbook.Sheets("データシート") を変更する。 |
| B2側の印刷範囲を変えたい | ws.Range("A1:T60") を変更する。 |
| C4側の印刷範囲を変えたい | ws.Range("A1:M46") を変更する。 |
| 印刷プレビューではなく直接印刷したい | ws.PrintPreview を ws.PrintOut に変更する。 |
| シート保護のパスワードを変えたい | password = "1234" を変更する。 |
このサンプルでは、シート保護解除用のパスワードをコード内に直接記述しています。
実務で使う場合は、パスワード管理に注意してください。
このページと後続記事の違い
このページでは、条件に合うシートを2種類の書式で印刷する基本的な流れを紹介しています。
印刷プレビューと直接印刷をユーザーが選べるようにする方法、特定シートを除外する方法、PDF出力する方法は、それぞれ別記事で紹介します。
| 記事 | 内容 |
|---|---|
| この記事 | 条件に合う複数シートを2種類の書式で印刷する基本編。 |
| 印刷方法を選べる記事 | 印刷プレビューか直接印刷をユーザーが選択できる応用編。 |
| 除外シートの記事 | 作業用シートやデータシートを印刷対象から除外する応用編。 |
| PDF出力の記事 | 複数シートを条件ごとにPDFとして出力するPDF編。 |
まとめ
Excel VBAを使うと、データシートの条件をもとに、対象となる複数のシートだけを印刷できます。
今回のマクロでは、C列に「福岡」と入力されている店番コードを取得し、その店番コードが各シートのB2またはC4にあるかを判定しています。
B2に店番コードがある場合は A1:T60、C4に店番コードがある場合は A1:M46 を印刷範囲にし、それぞれ異なる書式で印刷できます。
まずはこの基本形を作っておくと、後から印刷方法の選択、除外シート設定、PDF出力などに応用しやすくなります。


コメント