Excel VBA | 離れたセルをまとめて処理

VBA
スポンサーリンク

今回は 「離れたセルを自動検出して処理する」「複数シートをまたいで同じセルアドレスをまとめて操作する」 という、実務でよく使う“応用テクニック”を、初心者にも分かりやすくかみ砕いて紹介します。


① 離れたセルを“自動検出”して、そのうち 空白だけを黄色 にする

実務でよくあるシーン

  • チェック対象セルが表の中のあちこちにある
  • 空白のセルだけをハイライトしたい
  • セルの場所が毎回変わるので「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

どう動くの?

ステップの流れ

  1. シートの UsedRange(実際に使われている範囲)を1つずつループ
  2. 赤文字になっているセルだけを検出
  3. Union を使って、離れたセルでもまとめて Range 化
  4. 最後に、そのまとまりの中で 空白のセルだけ 黄色に塗る

初心者がつまづきやすいポイント

  • 最初の 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
VBA
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました