今回は 「離れたセルを自動検出して処理する」 と 「複数シートをまたいで同じセルアドレスをまとめて操作する」 という、実務でよく使う“応用テクニック”を、初心者にも分かりやすくかみ砕いて紹介します。
① 離れたセルを“自動検出”して、そのうち 空白だけを黄色 にする
実務でよくあるシーン
- チェック対象セルが表の中のあちこちにある
- 空白のセルだけをハイライトしたい
- セルの場所が毎回変わるので「A1, C3, E5」みたいに手書きで指定したくない
そんなときに「自動で“離れたセル”を集めて処理」する方法が便利です。
完成コード(初心者向けにコメント多め)
ポイント
- 特定色(例:赤文字)や特定条件でセルを“探す”
- 見つかったセルを
Unionでひとまとめに - 空白セルだけ
.Interior.Color = vbYellow
Sub 離れたセル_自動検出して空白を黄色にする()
Dim ws As Worksheet
Set ws = ActiveSheet
Dim c As Range
Dim target As Range ' ← 自動検出して結合する Range
'=== ① 条件に合うセルを探す ===
' 例:「赤文字のセル」をチェック対象とする
For Each c In ws.UsedRange
If c.Font.Color = vbRed Then
If target Is Nothing Then
Set target = c
Else
Set target = Union(target, c)
End If
End If
Next c
If target Is Nothing Then
MsgBox "対象セルが見つかりませんでした。"
Exit Sub
End If
'=== ② 空白セルだけを黄色にする ===
Dim a As Range
For Each a In target.Cells
If a.Value = "" Then
a.Interior.Color = vbYellow
End If
Next a
MsgBox "処理完了!"
End Sub
VBどう動くの?
ステップの流れ
- シートの UsedRange(実際に使われている範囲)を1つずつループ
- 赤文字になっているセルだけを検出
Unionを使って、離れたセルでもまとめて Range 化- 最後に、そのまとまりの中で 空白のセルだけ 黄色に塗る
初心者がつまづきやすいポイント
- 最初の
Unionのときだけ「初期化前かどうか」を判定する - 離れたセルは
targetが「複数の Area を持つ Range」になる
② 複数シートをまたいで 同じセル番地をまとめて操作 する
実務でよくあるシーン
- 月次シート(1月, 2月, 3月…)があり、各シートの「C5」の値をまとめて変更したい
- 全シートの「B2:B20」をチェックしたい
- 特定セルだけ一括書き換えしたい
これも VBA なら超シンプルにできます。
完成コード:複数シートの同じセルにまとめて値を入れる
Sub 複数シートの同じセルをまとめて操作する()
Dim ws As Worksheet
Dim target As Range
'=== ① 最初のシートのセルを起点にする ===
Set target = Sheets("1月").Range("C5")
'=== ② 他のシートのセルを Union で追加していく ===
For Each ws In Worksheets
If ws.Name <> "1月" Then
Set target = Union(target, ws.Range("C5"))
End If
Next ws
'=== ③ まとめて処理 ===
target.Value = "確定" ' 全シートの C5 が「確定」に
target.Font.Bold = True ' まとめて太字に
MsgBox "全シートの C5 を更新しました!"
End Sub
VB応用:複数列・複数行にも拡張できる
例えば各シートの「B2:B10」をまとめるなら:
Set target = Sheets("1月").Range("B2:B10")
For Each ws In Worksheets
If ws.Name <> "1月" Then
Set target = Union(target, ws.Range("B2:B10"))
End If
Next ws
target.ClearContents ' ← すべてのシートの同じ範囲をクリア
VB③ 実務レベルの “複合” 応用例
各シートの C5 をまとめて取得 → 配列にして → 一覧表へ出力
(データ集計の自動化でよく使います)
Sub 全シートのC5を一覧にまとめる()
Dim ws As Worksheet
Dim c As Range
Dim result() As Variant
Dim i As Long
'=== ① 配列の大きさをシート数で決める ===
ReDim result(1 To Worksheets.Count, 1 To 2)
i = 1
'=== ② 全シートの C5 を読み取る ===
For Each ws In Worksheets
result(i, 1) = ws.Name
result(i, 2) = ws.Range("C5").Value
i = i + 1
Next ws
'=== ③ 別シートに一覧出力 ===
With Sheets("集計")
.Range("A1:B1").Value = Array("シート名", "C5の値")
.Range("A2").Resize(UBound(result, 1), 2).Value = result
End With
MsgBox "集計完了!"
End Sub
VB