Excelで印刷たいシートが複数ある場合のVBA
Excelで一揆に印刷したい。そんなときに使ってみてください。
基準となるデータから抽出し印刷するコードです。
1. 処理の概要
-
「データシート」の
A列(店番コード)とC列(店名)を検索C列に “福岡” がある行のA列(店番コード)を取得- 店名が空白でも考慮
- 取得した店番コードをリスト(辞書型変数)に格納
-
全シートを検索し、以下の条件で処理
B2に 福岡の店番コード →A1:T60を 書式① で設定し印刷C4に 福岡の店番コード →A1:M46を 書式② で設定し印刷
-
シートが保護されている場合は保護解除
-
書式設定を適用
B2の場合 → 書式①(Arial, 太字, 薄青)C4の場合 → 書式②(Calibri, 斜体, 左上揃え, 薄黄)
-
余白設定・中央揃えの適用
-
印刷プレビュー(または直接印刷)
2. 詳細な処理の流れ
📌 ステップ 1:福岡の店番コードを取得
データシートの C列 を走査し、”福岡” がある行の A列(店番コード) を取得- 取得した店番コードを 辞書(
fukuokaShops)に格納(重複防止)
📌 ステップ 2:各シートを検索し、該当するシートのみ印刷
B2に福岡の店番コードがあるシート:- A1:T60 の範囲を「書式①」で設定&印刷
C4に福岡の店番コードがあるシート:- A1:M46 の範囲を「書式②」で設定&印刷
📌 ステップ 3:シートの保護を解除
- シートが保護されている場合 は、パスワードを使って保護を解除
- パスワードが不要なら
password = ""に設定
📌 ステップ 4:印刷範囲ごとに異なる書式設定を適用
📌 B2 に店番がある場合(書式①)
- 適用範囲:
A1:T60 - フォント:Arial、サイズ:12、太字
- 背景色:薄青(
RGB(200, 200, 255)) - 横・縦中央揃え
📌 C4 に店番がある場合(書式②)
- 適用範囲:
A1:M46 - フォント:Calibri、サイズ:10、斜体
- 背景色:薄黄(
RGB(255, 255, 200)) - 左上揃え
📌 ステップ 5:余白・中央揃えの適用
B2のシート → 余白を広め(中央揃え)C4のシート → 余白を狭め(中央揃えなし)
📌 ステップ 6:印刷
- 現在はプレビュー表示 (
PrintPreview) - 直接印刷したい場合は
PrintOutに変更可能
3. コードの分割
| 処理 | コード内の対応関数 |
|---|---|
| 福岡の店番を取得 | PrintSheetsWithFukuokaShops |
B2 に店番があるシートを処理 |
FormatAndPrintSheet_Type1 |
C4 に店番があるシートを処理 |
FormatAndPrintSheet_Type2 |
VBAコード
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 ' 印刷範囲
' ① データシートの設定(店番コードと店名があるシート)
Set dataSheet = ThisWorkbook.Sheets("データシート")
' ② 福岡の店番を格納する辞書(重複を避けるために使用)
Set fukuokaShops = CreateObject("Scripting.Dictionary")
' シート保護解除用のパスワード(不要なら "" に設定)
password = "1234"
' ③ データシートのC列を走査し、「福岡」の店番を辞書に格納
For Each cell In dataSheet.Range("C1:C" & dataSheet.Cells(Rows.Count, 3).End(xlUp).Row)
' C列が "福岡" の場合、A列の店番を辞書に格納(店名が空白でも処理)
If cell.Value = "福岡" And Not fukuokaShops.exists(cell.Offset(0, -2).Value) Then
fukuokaShops.Add cell.Offset(0, -2).Value, True
End If
Next cell
' ④ 各シートをループして、該当するシートのみ印刷
For Each ws In ThisWorkbook.Worksheets
' データシート自体はスキップ(印刷対象外)
If ws.Name <> dataSheet.Name Then
' ⑤ シート保護が有効なら解除
If ws.ProtectContents Then
On Error Resume Next
ws.Unprotect Password:=password
If Err.Number <> 0 Then
MsgBox "シート '" & ws.Name & "' の保護を解除できませんでした。", vbCritical
Exit Sub
End If
On Error GoTo 0
End If
' ⑥ B2 または C4 に店番があるかチェック
If Not IsEmpty(ws.Range("B2").Value) Then
shopCode = ws.Range("B2").Value
If fukuokaShops.exists(shopCode) Then
' A1:T60 を **書式①** で書式設定して印刷
Set printRange = ws.Range("A1:T60")
Call FormatAndPrintSheet_Type1(ws, printRange)
End If
End If
If Not IsEmpty(ws.Range("C4").Value) Then
shopCode = ws.Range("C4").Value
If fukuokaShops.exists(shopCode) Then
' A1:M46 を **書式②** で書式設定して印刷
Set printRange = ws.Range("A1:M46")
Call FormatAndPrintSheet_Type2(ws, printRange)
End If
End If
End If
Next ws
' 完了メッセージ
MsgBox "福岡の店番があるシートの印刷が完了しました。", vbInformation
End Sub
' ⑦ 【書式①】B2 に店番がある場合の書式設定と印刷
Sub FormatAndPrintSheet_Type1(ws As Worksheet, printRange As Range)
' ⑧ 書式設定(書式①)
With printRange
.Font.Name = "Arial" ' フォントをArialに設定
.Font.Size = 12 ' フォントサイズを12に設定
.Font.Bold = True ' 太字
.HorizontalAlignment = xlCenter ' 横方向に中央揃え
.VerticalAlignment = xlCenter ' 縦方向に中央揃え
.Interior.Color = RGB(200, 200, 255) ' セルの背景色を薄青(RGB値)
End With
' ⑨ 印刷設定(余白・中央揃え)
With ws.PageSetup
.PrintArea = printRange.Address ' 印刷範囲を指定
.LeftMargin = Application.InchesToPoints(0.5) ' 左余白0.5インチ
.RightMargin = Application.InchesToPoints(0.5) ' 右余白0.5インチ
.TopMargin = Application.InchesToPoints(0.75) ' 上余白0.75インチ
.BottomMargin = Application.InchesToPoints(0.75) ' 下余白0.75インチ
.HeaderMargin = Application.InchesToPoints(0.3) ' ヘッダー余白0.3インチ
.FooterMargin = Application.InchesToPoints(0.3) ' フッター余白0.3インチ
.CenterHorizontally = True ' 横方向の中央揃え
.CenterVertically = True ' 縦方向の中央揃え
End With
' ⑩ 印刷(プレビュー or 直接印刷)
ws.PrintPreview ' 印刷プレビュー
' ws.PrintOut ' 直接印刷する場合はこちらを有効に
End Sub
' ⑪ 【書式②】C4 に店番がある場合の書式設定と印刷
Sub FormatAndPrintSheet_Type2(ws As Worksheet, printRange As Range)
' ⑫ 書式設定(書式②)
With printRange
.Font.Name = "Calibri" ' フォントをCalibriに設定
.Font.Size = 10 ' フォントサイズを10に設定
.Font.Italic = True ' 斜体
.HorizontalAlignment = xlLeft ' 左揃え
.VerticalAlignment = xlTop ' 上揃え
.Interior.Color = RGB(255, 255, 200) ' セルの背景色を薄黄(RGB値)
End With
' ⑬ 印刷設定(余白・中央揃え)
With ws.PageSetup
.PrintArea = printRange.Address ' 印刷範囲を指定
.LeftMargin = Application.InchesToPoints(0.3) ' 左余白0.3インチ
.RightMargin = Application.InchesToPoints(0.3) ' 右余白0.3インチ
.TopMargin = Application.InchesToPoints(0.5) ' 上余白0.5インチ
.BottomMargin = Application.InchesToPoints(0.5) ' 下余白0.5インチ
.CenterHorizontally = False ' 水平中央揃えなし
.CenterVertically = False ' 垂直中央揃えなし
End With
' ⑭ 印刷(プレビュー or 直接印刷)
ws.PrintPreview ' 印刷プレビュー
' ws.PrintOut ' 直接印刷する場合はこちらを有効に
End Sub
4. 実行手順
- VBAエディタを開く(
Alt + F11) - 標準モジュールを追加
- コードを貼り付け
- データシートの名前を変更(
データシート→ 実際のシート名) - パスワードを設定(不要なら
password = "") - マクロを実行(
Alt + F8→PrintSheetsWithFukuokaShopsを選択)
⚙️ 5. カスタマイズ可能な部分
| 項目 | 変更方法 |
|---|---|
| 検索する店舗名 | "福岡" → "大阪" などに変更 |
| 検索するセルの位置 | B2 や C4 の位置を変更 |
| 印刷範囲の調整 | A1:T60 や A1:M46 を変更 |
| フォントや背景色 | Arial や Interior.Color を変更 |
| 印刷余白や中央揃え | .LeftMargin = ... などの設定を変更 |
| 印刷プレビュー or 直接印刷 | ws.PrintPreview → ws.PrintOut |
📢 6. 注意点
✅ データシートの店番が “福岡” であるか確認
✅ シートの保護解除が必要なら password = "1234" を設定(不要なら "" に)
✅ Excelの設定によって、プレビューの表示が遅くなる場合がある(100シートなど大量処理時)
🚀 7. まとめ
🔹 福岡の店番コードを取得し、該当するシートを印刷
🔹 B2 の場合は A1:T60(書式①)、C4 の場合は A1:M46(書式②)を適用
🔹 シート保護を解除し、書式設定・余白調整を適用
🔹 現在はプレビュー表示(直接印刷も可能)
📌 補足:77行目.Interior.Colorはどの部分で役に立っているか?
🔹 1. 印刷前の視認性向上
このコードは、印刷前に「この範囲が選択され、適用されたこと」を 視覚的に明確にする ために役立っています。
ユーザーがExcelを開いたときに、「このセルが印刷対象」とひと目で分かるようになります。
With printRange
.Font.Name = "Arial" ' フォントをArialに設定
.Font.Size = 12 ' フォントサイズを12に設定
.Font.Bold = True ' 太字
.HorizontalAlignment = xlCenter ' 横方向に中央揃え
.VerticalAlignment = xlCenter ' 縦方向に中央揃え
.Interior.Color = RGB(200, 200, 255) ' 💡 セルの背景色を薄青(Excel上の視認性向上)
End With
こうすることで、印刷対象の範囲が Excel上では青く強調 され、ユーザーは どのセルが処理されるのか確認しやすく なります。

コメント