条件に合うシートにだけ処理
「名前で絞る」「可視だけ」「保護状態」「連番やインデックス」「一覧シートの条件」——狙ったシートだけに安全に処理するテンプレートを、初心者向けに噛み砕いてまとめました。コメント部をあなたの処理に差し替えれば、そのまま使えます。
基本テンプレート:条件に合えば処理する
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
VBControlで「対象・除外・条件」を分離管理(柔軟)
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へ戻す。
