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上では青く強調 され、ユーザーは どのセルが処理されるのか確認しやすく なります。
コメント