Excel VBA 逆引き集 | すべてのシートへ一括処理

Excel VBA
スポンサーリンク

すべてのシートへ一括処理

「全シートに同じ処理を適用」「除外や対象指定」「可視だけ」「選択中だけ」——初心者でも迷わず使える安全テンプレートと実務例をまとめました。コピペして、あなたの処理だけ差し替えればすぐ動きます。


基本:全ワークシートに同じ処理を適用

Sub ApplyAllWorksheets_Basic()
    Dim ws As Worksheet
    For Each ws In ThisWorkbook.Worksheets
        'ここにやりたい処理を書く(例:ヘッダー設定)
        ws.Range("A1").Value = "タイトル"
        ws.Range("B1").Value = "作成日"
        ws.Range("C1").Value = Date
    Next
End Sub
VB
  • ポイント:
    • 全ワークシート対象: グラフシートは含まれない。
    • 処理差し替え: コメント部だけあなたの処理に置き換えればOK。

安全テンプレート:共通処理を1か所に定義して呼ぶ

Sub ProcessAllSheets()
    Dim s As Object
    Application.ScreenUpdating = False   '画面更新オフで高速・安定
    For Each s In ThisWorkbook.Sheets
        Call ApplyToSheet(s)
    Next
    Application.ScreenUpdating = True
End Sub

Sub ApplyToSheet(ByVal s As Object)
    'グラフシートも来る可能性があるので分岐
    If TypeOf s Is Worksheet Then
        'ワークシート向けの共通処理(例:ヘッダー+罫線)
        With s
            .Range("A1").Value = "タイトル"
            .Range("B1").Value = "更新日"
            .Range("C1").Value = Date
            .Range("A1:C1").Font.Bold = True
            .Range("A1:C1").Borders.LineStyle = xlContinuous
        End With
    Else
        '必要ならグラフシート(Chart)向け処理を書く
        '例:何もしない
    End If
End Sub
VB
  • ポイント:
    • 共通処理を関数化: 1か所変更すれば全体に反映。
    • Sheetsで包括: グラフシートも来るためType判定で安全に。

条件指定:除外・可視のみ・名前一致・部分一致

Sub ApplyAllWorksheets_WithFilters()
    Dim ws As Worksheet
    Dim exclude As Variant: exclude = Array("設定", "Index") '除外名
    Application.ScreenUpdating = False

    For Each ws In ThisWorkbook.Worksheets
        '除外名ならスキップ
        If Not IsInArray(ws.Name, exclude) Then
            '可視のみ
            If ws.Visible = xlSheetVisible Then
                '名前に「売上」を含むシートだけ
                If InStr(1, ws.Name, "売上", vbTextCompare) > 0 Then
                    'ここに処理を書く(例:A2へ印刷日)
                    ws.Range("A2").Value = "印刷日"
                    ws.Range("B2").Value = Date
                End If
            End If
        End If
    Next

    Application.ScreenUpdating = True
End Sub

Function IsInArray(val As String, arr As Variant) As Boolean
    Dim i As Long
    For i = LBound(arr) To UBound(arr)
        If StrComp(val, CStr(arr(i)), vbTextCompare) = 0 Then
            IsInArray = True: Exit Function
        End If
    Next
End Function
VB
  • ポイント:
    • 除外リスト: 管理しやすい定番。
    • 可視限定+名前フィルタ: 実務の「対象だけ」に効かせる。

選択中の複数シートだけを一括処理(作業グループ)

Sub ApplySelectedSheetsOnly()
    Dim s As Object
    If TypeName(ActiveWindow) = "Window" Then
        Application.ScreenUpdating = False
        For Each s In ActiveWindow.SelectedSheets
            If TypeOf s Is Worksheet Then
                'ここに処理(例:A1に日付)
                s.Range("A1").Value = Date
            End If
        Next
        Application.ScreenUpdating = True
    End If
End Sub
VB
  • ポイント:
    • SelectedSheets: Shift+クリックで複数選択したシートにだけ処理。
    • 安全運用: グラフシート混入に備えType判定。

実務テンプレート:保護の一時解除→処理→再保護

Sub ApplyAll_WithProtectCycle()
    Dim ws As Worksheet
    Dim pwd As String: pwd = "lock" '必要に応じて入力運用に変更

    Application.ScreenUpdating = False

    For Each ws In ThisWorkbook.Worksheets
        '必要なら除外条件
        If ws.Visible = xlSheetVisible Then
            '一時解除
            On Error Resume Next
            ws.Unprotect Password:=pwd
            On Error GoTo 0

            '処理(例:最終行の下にログ追記)
            Dim r As Long
            r = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row + 1
            ws.Cells(r, "A").Value = Now
            ws.Cells(r, "B").Value = Environ$("Username")
            ws.Cells(r, "C").Value = "一括更新"

            '再保護(必要なオプションを併用)
            ws.Protect Password:=pwd, AllowFiltering:=True, AllowSorting:=True
        End If
    Next

    Application.ScreenUpdating = True
End Sub
VB
  • ポイント:
    • 忘れない構造: 解除→処理→再保護のワンセット。
    • 例外耐性: Unprotect失敗でも処理が止まらない。

例題で練習:よくある一括タスク

印刷設定を全シートへ適用

Sub ApplyPrintSettingsAll()
    Dim ws As Worksheet
    For Each ws In ThisWorkbook.Worksheets
        With ws.PageSetup
            .Orientation = xlLandscape
            .Zoom = False
            .FitToPagesWide = 1
            .FitToPagesTall = False
            .CenterHorizontally = True
            .CenterVertically = False
        End With
    Next
    MsgBox "印刷設定を全シートへ適用しました。"
End Sub
VB
  • ポイント:
    • 横向き・横幅1ページ: 配布用に便利な標準設定。

見出し行と書式を全シートへ

Sub ApplyHeaderStyleAll()
    Dim ws As Worksheet
    For Each ws In ThisWorkbook.Worksheets
        With ws.Range("A1:D1")
            .Value = Array("項目A", "項目B", "項目C", "項目D")
            .Font.Bold = True
            .Interior.Color = RGB(221, 235, 247) '薄いブルー
            .Borders.LineStyle = xlContinuous
        End With
        ws.Columns("A:D").AutoFit
    Next
End Sub
VB
  • ポイント:
    • 体裁統一: 配布物の見やすさが一気に上がる。

可視ワークシートのみ日付スタンプ

Sub StampDate_VisibleOnly()
    Dim ws As Worksheet
    For Each ws In ThisWorkbook.Worksheets
        If ws.Visible = xlSheetVisible Then
            ws.Range("Z1").Value = "更新日: " & Format(Date, "yyyy/mm/dd")
        End If
    Next
End Sub
VB
  • ポイント:
    • 画面操作前提: 非表示は触らない運用。

実務の落とし穴と対策

  • 対象の取り違え:
    • ThisWorkbook/ActiveWorkbookを統一: マクロ格納ブックか操作中ブックかを明示。
  • グラフシート混入:
    • Type判定: Sheetsを走査するならTypeOfでWorksheetか確認。
  • 表示更新で遅い・ちらつく:
    • ScreenUpdatingをFalse: 開始時オフ→終了時オンが基本。
  • 保護やVeryHiddenが邪魔:
    • 事前チェック: Visible状態や保護有無を見て分岐。一時解除→再保護のテンプレートを活用。
  • 例外で途中停止:
    • On Errorの最小限活用: 必要箇所だけResume Nextを使い、最後に戻す。

次の一歩(小課題)

  • 課題1: 除外リスト(「Index」「設定」)を維持しつつ、全シートのA1:D1に見出し+体裁を適用。
  • 課題2: 可視シートだけ印刷設定を横向き・横幅1ページにし、完了後にメッセージ表示。
  • 課題3: 選択中(作業グループ)の複数シートにだけ「最終行へログ追記」を行う。

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