今回は 「離れたセル(=連続していない複数のセル)をまとめて扱う方法」 を中心に、使い方・注意点・よくあるパターン・練習問題(解答付き)を用意しました。
離れたセルをまとめて扱うとは?
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
VBRange("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
VBrng.Areasを使うとA1とC3:D5が別々のAreaとしてループできます。- これを使うと、各ブロック単位で異なる処理がしやすくなります。
注意点(初心者がハマりやすいポイント)
- 区切りはカンマ(,)
Range("A1, B2")のようにカンマで区切る。スペースやセミコロンではダメ。 - 一度に代入したときの挙動
rng.Value = 10は全てのセルに 10 を入れます。もしrngのあるAreaが複数セルで、同時に配列を代入しようとすると形(行数×列数)が合っている必要があります。離れたエリアが異なるサイズのときは要注意。 - 連続範囲と混ぜるときの取り扱い
連続範囲(A1:B2)と単一セル(C5)が混ざっていると、rng.Valueを読み出すときに想定と違う形で返る可能性があります。値の読み書きはFor Each Areaを使って丁寧に扱うと安全です。 - パフォーマンス
セルを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ごとに配列化して処理する方法が有効です。
まとめ(初心者が押さえるべき要点)
Range("A1, C3, E5")のように カンマで区切って離れたセルをまとめて指定できる。Unionを使うとプログラムで動的に範囲を結合できる。- 離れたセルは内部的に
Areas(領域)に分かれるので、各領域をFor Eachで処理するのが安全。 - 一度に
.Valueなどを使ってまとめて操作できるが、領域のサイズや形に依存するものは注意が必要。 - 実務では「まとめて指定 → 一括操作」することで可読性と速度が改善されることが多い。
