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

VBA
スポンサーリンク

今回は 「離れたセル(=連続していない複数のセル)をまとめて扱う方法」 を中心に、使い方・注意点・よくあるパターン・練習問題(解答付き)を用意しました。

離れたセルをまとめて扱うとは?

Excel のセルは隣り合った範囲(例:A1:D4)のほかに、散らばった個々のセル(例:A1 と C3 と E5)があります。VBAでは1つの Range オブジェクトに離れたセルをまとめて指定できます。すると、そのまとまりに対して値を入れたり、色を付けたり、といった操作を一度に行えます。


基本:カンマ区切りで指定する

最も簡単な書き方は文字列でカンマ区切りにする方法です。

Sub サンプル1()
    Dim rng As Range
    Set rng = Range("A1, C3, E5")  ' A1, C3, E5 をまとめて rng に
    rng.Value = 100                ' まとめて 100 を入れる
End Sub
VB
  • Range("A1, C3, E5")3つの離れたセル をまとめて指定。
  • rng.Value = 100 はその すべてのセルに 100 を入れる 処理になります。

連続した範囲と混ぜることもできる

離れたセルと連続範囲(: を使う指定)を混ぜることもできます。

Sub サンプル2()
    Dim rng As Range
    Set rng = Range("A1, C3:D5")   ' A1 と C3:D5 の両方をまとめる
    rng.ClearContents              ' まとめて中身を消す
End Sub
VB

より柔軟に:Union を使う

Union 関数を使うとプログラム中で Range を結合できます(動的に作る時に便利)。

Sub サンプル3()
    Dim r1 As Range, r2 As Range, rAll As Range
    Set r1 = Range("A1")
    Set r2 = Range("C3:D5")
    Set rAll = Application.Union(r1, r2)
    rAll.Interior.ColorIndex = 6  ' まとめて背景色を黄色に
End Sub
VB

重要:複数の「連続ブロック(Area)」として扱われる

離れたセルが混ざった Range は内部的に 複数の Area(領域) に分かれます。連続したブロックごとに Range.Areas コレクションでアクセスできます。個別処理するときは For Each で回すのが基本です。

Sub サンプル4()
    Dim rng As Range
    Dim a As Range
    Set rng = Range("A1, C3:D5, F1")  ' 3 つの Area(A1/C3:D5/F1)
    For Each a In rng.Areas
        Debug.Print "Area: " & a.Address & " / Cells count: " & a.Count
        a.Font.Bold = True   ' 各 Area を太字に
    Next a
End Sub
VB
  • rng.Areas を使うと A1C3:D5 が別々の Area としてループできます。
  • これを使うと、各ブロック単位で異なる処理がしやすくなります。

注意点(初心者がハマりやすいポイント)

  1. 区切りはカンマ(,)
    Range("A1, B2") のようにカンマで区切る。スペースやセミコロンではダメ。
  2. 一度に代入したときの挙動
    rng.Value = 10 は全てのセルに 10 を入れます。もし rng のある Area が複数セルで、同時に配列を代入しようとすると形(行数×列数)が合っている必要があります。離れたエリアが異なるサイズのときは要注意。
  3. 連続範囲と混ぜるときの取り扱い
    連続範囲(A1:B2)と単一セル(C5)が混ざっていると、rng.Value を読み出すときに想定と違う形で返る可能性があります。値の読み書きは For Each Area を使って丁寧に扱うと安全です。
  4. パフォーマンス
    セルを1つずつ操作するより、範囲をまとめて操作するほうが速い。逆に、離れた多数のセルを For Each cell In rng.Cells で逐一操作すると遅くなることがある(必要に応じて配列に読み込む高速化が有効)。

実践的な例題

以下は初心者が実際に手を動かせる練習問題です。各問題の下に解答(コード)を付けています。

例題1:指定した離れたセルに色を付ける

A1, C1, E1 に薄いグレーの背景色を付けるマクロを作ってください。

解答

Sub 問題1_色を付ける()
    Dim rng As Range
    Set rng = Range("A1, C1, E1")
    rng.Interior.ColorIndex = 15  ' 色番号は Excel のカラーパレットによる
End Sub
VB

例題2:離れたセルに同じ値を一括で入れる

B2, D4:F5 のすべてに「完了」と入れるマクロを作ってください。

解答

Sub 問題2_完了を入れる()
    Dim rng As Range
    Set rng = Range("B2, D4:F5")
    rng.Value = "完了"
End Sub
VB

例題3:各ブロック(Area)に異なる処理をする

Range(“A1:B2, D1:D3”) の各エリアごとに、セルの個数をメッセージで表示するマクロを作ってください。

解答

Sub 問題3_Areaごとに個数を出す()
    Dim rng As Range, a As Range
    Set rng = Range("A1:B2, D1:D3")
    For Each a In rng.Areas
        MsgBox "領域: " & a.Address & vbCrLf & "セル数: " & a.Count
    Next a
End Sub
VB

例題4(少し実用的):指定した離れたセルの値を集めて、別の場所に一覧で貼る

Range(“A1, C1, E1”) の値を Sheet2 の A1:A3 に順番に書き出すマクロを作ってください。

解答

Sub 問題4_値を一覧にする()
    Dim src As Range, dst As Range, i As Long, c As Range
    Set src = ThisWorkbook.Worksheets("Sheet1").Range("A1, C1, E1")
    Set dst = ThisWorkbook.Worksheets("Sheet2").Range("A1")
    i = 0
    For Each c In src.Cells
        dst.Offset(i, 0).Value = c.Value
        i = i + 1
    Next c
End Sub
VB

ワンポイント:複数セルの読み取り・高速化メモ

  • 大量のセルを操作する場合は、ワークシートの表示更新を止めたり(Application.ScreenUpdating = False)する、必要なデータだけ Variant 配列に読み込んで処理してから一括で書き戻す、というテクニックが速くなります。
  • ただし「離れたセル」を扱うとき、配列に読み込めるのは連続した範囲です。離れたセルは For Each で回すか、Union でまとめてから Areas ごとに配列化して処理する方法が有効です。

まとめ(初心者が押さえるべき要点)

  1. Range("A1, C3, E5") のように カンマで区切って離れたセルをまとめて指定できる。
  2. Union を使うとプログラムで動的に範囲を結合できる。
  3. 離れたセルは内部的に Areas(領域)に分かれるので、各領域を For Each で処理するのが安全。
  4. 一度に .Value などを使ってまとめて操作できるが、領域のサイズや形に依存するものは注意が必要。
  5. 実務では「まとめて指定 → 一括操作」することで可読性と速度が改善されることが多い。
VBA
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました