Excel VBA 逆引き集 | 条件に合うシートにだけ処理

Excel VBA
スポンサーリンク

条件に合うシートにだけ処理

「名前で絞る」「可視だけ」「保護状態」「連番やインデックス」「一覧シートの条件」——狙ったシートだけに安全に処理するテンプレートを、初心者向けに噛み砕いてまとめました。コメント部をあなたの処理に差し替えれば、そのまま使えます。


基本テンプレート:条件に合えば処理する

Sub ApplyIf_MatchNameContains()
    Dim ws As Worksheet
    For Each ws In ThisWorkbook.Worksheets
        If InStr(1, ws.Name, "売上", vbTextCompare) > 0 Then
            ' 条件に合うシートだけ実行(例:ヘッダー設定)
            ws.Range("A1").Value = "売上サマリー"
            ws.Range("B1").Value = Date
        End If
    Next
End Sub
VB
  • ポイント:
    • 部分一致: 名前に「売上」を含むシートだけに処理。vbTextCompareで大小無視。
    • 差し替え簡単: コメント行をあなたの処理に置き換えればOK。

よく使う条件ごとの安全テンプレート

可視だけに処理(Hidden/VeryHiddenは除外)

Sub ApplyIf_VisibleOnly()
    Dim ws As Worksheet
    For Each ws In ThisWorkbook.Worksheets
        If ws.Visible = xlSheetVisible Then
            ' 可視のみ(例:Z1に更新日)
            ws.Range("Z1").Value = "更新日: " & Format(Date, "yyyy/mm/dd")
        End If
    Next
End Sub
VB

完全非表示(VeryHidden)を除外し、通常の非表示(Hidden)は含めない

Sub ApplyIf_NotVeryHidden()
    Dim ws As Worksheet
    For Each ws In ThisWorkbook.Worksheets
        If ws.Visible <> xlSheetVeryHidden Then
            ' VeryHidden以外(画面操作前の準備など)
            ws.Range("A2").Value = "準備OK"
        End If
    Next
End Sub
VB

シート保護状態で分岐(保護中は別処理)

Sub ApplyIf_Protected()
    Dim ws As Worksheet
    For Each ws In ThisWorkbook.Worksheets
        If ws.ProtectContents Then
            ' 保護中(例:見出しだけ更新)
            ws.Range("A1").Value = "保護中"
        Else
            ' 非保護(例:内容まで更新)
            ws.Range("A1").Value = "編集可"
            ws.Range("B1").Value = Date
        End If
    Next
End Sub
VB

先頭が接頭辞に一致(Prefixで判定)

Sub ApplyIf_NameStartsWith()
    Dim ws As Worksheet
    For Each ws In ThisWorkbook.Worksheets
        If Left$(ws.Name, Len("週報_")) = "週報_" Then
            ' 週報シートだけ(例:週番号を抽出して書き込み)
            ws.Range("A1").Value = "週報"
        End If
    Next
End Sub
VB

インデックス範囲で絞る(左からN枚だけなど)

Sub ApplyIf_ByIndexRange()
    Dim i As Long, n As Long
    n = ThisWorkbook.Worksheets.Count
    For i = 1 To Application.Min(5, n) '左端から最大5枚
        With ThisWorkbook.Worksheets(i)
            ' 先頭グループだけ(例:目次整形)
            .Range("A1").Value = "先頭グループ"
        End With
    Next
End Sub
VB

条件をひとまとめにできる汎用フィルタ

任意の「判定関数」に合致するシートだけ処理

Sub ApplyWithPredicate()
    Dim ws As Worksheet
    For Each ws In ThisWorkbook.Worksheets
        If ShouldProcess(ws) Then
            ' 合致したシートにだけ処理
            ws.Range("A1").Value = "対象"
        End If
    Next
End Sub

Function ShouldProcess(ws As Worksheet) As Boolean
    ' ここに複合条件をまとめる(例:可視かつ「売上」を含む、保護されていない)
    ShouldProcess = (ws.Visible = xlSheetVisible) _
                    And (InStr(1, ws.Name, "売上", vbTextCompare) > 0) _
                    And (ws.ProtectContents = False)
End Function
VB
  • ポイント:
    • 変更が楽: 条件を1か所で管理でき、処理側がスッキリする。
    • 複合条件: 可視・名前・保護などの組み合わせが簡単。

一覧シートから条件を与える(運用向け)

Controlシートのリストで「対象名」を指定

Sub ApplyByControlList()
    Dim ctrl As Worksheet, last As Long, r As Long, nm As String, ws As Worksheet
    Set ctrl = ThisWorkbook.Worksheets("Control")
    last = ctrl.Cells(ctrl.Rows.Count, "A").End(xlUp).Row

    For r = 2 To last 'A2から下に対象名が並ぶ前提
        nm = CStr(ctrl.Cells(r, "A").Value)
        On Error Resume Next
        Set ws = ThisWorkbook.Worksheets(nm)
        On Error GoTo 0
        If Not ws Is Nothing Then
            ' 対象名に一致したシートだけ処理
            ws.Range("A1").Value = "Control指定"
        End If
        Set ws = Nothing
    Next
End Sub
VB

Controlで「対象・除外・条件」を分離管理(柔軟)

Sub ApplyByRulesFromControl()
    ' Control!A:A 対象名(完全一致)、B:B 除外名、C:C 部分一致キーワード
    Dim ctrl As Worksheet: Set ctrl = ThisWorkbook.Worksheets("Control")
    Dim targets As Object, excludes As Object, keywords As Object
    Set targets = CreateObject("Scripting.Dictionary")
    Set excludes = CreateObject("Scripting.Dictionary")
    Set keywords = CreateObject("Scripting.Dictionary")

    Dim last As Long, r As Long
    last = ctrl.Cells(ctrl.Rows.Count, "A").End(xlUp).Row
    For r = 2 To last: If Len(ctrl.Cells(r, "A").Value) > 0 Then targets(ctrl.Cells(r, "A").Value) = True
    Next
    last = ctrl.Cells(ctrl.Rows.Count, "B").End(xlUp).Row
    For r = 2 To last: If Len(ctrl.Cells(r, "B").Value) > 0 Then excludes(ctrl.Cells(r, "B").Value) = True
    Next
    last = ctrl.Cells(ctrl.Rows.Count, "C").End(xlUp).Row
    For r = 2 To last: If Len(ctrl.Cells(r, "C").Value) > 0 Then keywords(ctrl.Cells(r, "C").Value) = True
    Next

    Dim ws As Worksheet, key As Variant
    For Each ws In ThisWorkbook.Worksheets
        If Not excludes.Exists(ws.Name) Then
            If targets.Count = 0 Or targets.Exists(ws.Name) Then
                If keywords.Count = 0 Then
                    ' キーワード指定なしなら即処理
                    ws.Range("A1").Value = "Controlルール適用"
                Else
                    ' いずれかのキーワードを含むなら処理
                    For Each key In keywords.Keys
                        If InStr(1, ws.Name, CStr(key), vbTextCompare) > 0 Then
                            ws.Range("A1").Value = "Controlキーワード適用"
                            Exit For
                        End If
                    Next
                End If
            End If
        End If
    Next
End Sub
VB
  • ポイント:
    • 表で運用: 対象・除外・キーワードをシートで管理でき、現場で編集しやすい。
    • 条件が可変: マクロを触らず運用側で条件を更新可能。

選択中(作業グループ)のシートにだけ処理

Sub ApplyToSelectedSheets()
    Dim s As Object
    If TypeName(ActiveWindow) = "Window" Then
        For Each s In ActiveWindow.SelectedSheets
            If TypeOf s Is Worksheet Then
                ' Shift+クリックで選んだものだけ処理
                s.Range("A1").Value = "選択対象"
            End If
        Next
    End If
End Sub
VB
  • ポイント:
    • 実務の時短: 手で選んだ集合にだけ適用。誤処理が減る。

例題で練習

例題1:名前が「週報_」で始まる可視シートだけ日付スタンプ

Sub Example_WeeklyVisibleStamp()
    Dim ws As Worksheet
    For Each ws In ThisWorkbook.Worksheets
        If ws.Visible = xlSheetVisible And Left$(ws.Name, 3) = "週報" Then
            ws.Range("Z1").Value = "更新日: " & Format(Date, "yyyy/mm/dd")
        End If
    Next
End Sub
VB

例題2:保護されていない「売上」系だけ印刷設定を適用

Sub Example_PrintSettingsForSales()
    Dim ws As Worksheet
    For Each ws In ThisWorkbook.Worksheets
        If InStr(1, ws.Name, "売上", vbTextCompare) > 0 And ws.ProtectContents = False Then
            With ws.PageSetup
                .Orientation = xlLandscape
                .Zoom = False
                .FitToPagesWide = 1
                .FitToPagesTall = False
            End With
        End If
    Next
End Sub
VB

例題3:Control指定の対象にだけ「A1:D1」見出し・書式を一括

Sub Example_HeaderFromControlTargets()
    Dim ctrl As Worksheet, last As Long, r As Long, nm As String, ws As Worksheet
    Set ctrl = ThisWorkbook.Worksheets("Control")
    last = ctrl.Cells(ctrl.Rows.Count, "A").End(xlUp).Row

    For r = 2 To last
        nm = CStr(ctrl.Cells(r, "A").Value)
        On Error Resume Next
        Set ws = ThisWorkbook.Worksheets(nm)
        On Error GoTo 0
        If Not ws Is Nothing Then
            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
        End If
        Set ws = Nothing
    Next
End Sub
VB

実務の落とし穴と対策

  • 対象ブックの取り違え: ThisWorkbookとActiveWorkbookを意図で統一。別ブックはWorkbooks(“名前”)を明示。
  • 非表示の画面操作エラー: Select/Activateは可視チェックを挟むか避ける。オブジェクト参照で処理する。
  • 保護中の書き込み失敗: 必要なら一時Unprotect→処理→Protectのワンセットを用意。
  • 名前の揺れ: 部分一致・Prefix判定・Control一覧で運用面を補強。
  • パフォーマンス: 大量処理はApplication.ScreenUpdating=Falseで高速化し、終了時にTrueへ戻す。

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