【ExcelVBA】特定のデータシートから、2つの印刷書式設定で印刷するコード※各行コメント付きで!

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

Excelで印刷たいシートが複数ある場合のVBA

Excelで一揆に印刷したい。そんなときに使ってみてください。
基準となるデータから抽出し印刷するコードです。

1. 処理の概要

  1. 「データシート」の A列(店番コード)と C列(店名)を検索

    • C列“福岡” がある行の A列(店番コード)を取得
    • 店名が空白でも考慮
    • 取得した店番コードをリスト(辞書型変数)に格納
  2. 全シートを検索し、以下の条件で処理

    • B2福岡の店番コードA1:T60書式① で設定し印刷
    • C4福岡の店番コードA1:M46書式② で設定し印刷
  3. シートが保護されている場合は保護解除

  4. 書式設定を適用

    • B2 の場合 → 書式①(Arial, 太字, 薄青)
    • C4 の場合 → 書式②(Calibri, 斜体, 左上揃え, 薄黄)
  5. 余白設定・中央揃えの適用

  6. 印刷プレビュー(または直接印刷)

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. 実行手順

  1. VBAエディタを開くAlt + F11
  2. 標準モジュールを追加
  3. コードを貼り付け
  4. データシートの名前を変更(データシート → 実際のシート名)
  5. パスワードを設定(不要なら password = ""
  6. マクロを実行Alt + F8PrintSheetsWithFukuokaShops を選択)

⚙️ 5. カスタマイズ可能な部分

項目 変更方法
検索する店舗名 "福岡""大阪" などに変更
検索するセルの位置 B2C4 の位置を変更
印刷範囲の調整 A1:T60A1:M46 を変更
フォントや背景色 ArialInterior.Color を変更
印刷余白や中央揃え .LeftMargin = ... などの設定を変更
印刷プレビュー or 直接印刷 ws.PrintPreviewws.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上では青く強調 され、ユーザーは どのセルが処理されるのか確認しやすく なります。

コメント

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