Excel VBA | 複数セルの参照する

VBA
スポンサーリンク

VBAで複数セルを参照する基本

Excel VBAで複数セルを扱うときの鍵は「Rangeオブジェクト」です。Rangeは「一つのセル」「連続した範囲」「離れた範囲の集合」まで表現できます。つまり、見た目はバラバラでも、VBAの中では「ひとつのまとまり」として操作できます。


連続セルの参照

連続したセルは、開始セルと終了セルをコロンでつないで指定します。

' A1からC3までの矩形範囲
Range("A1:C3").Value = 1

' 1列全体や1行全体も指定可能
Rows("2:2").Font.Bold = True
Columns("E").Interior.Color = vbYellow
VB
  • 基本形: 「開始セル:終了セル」
  • 行/列: Rows/Columnsでも指定できる

離れたセルの参照(2つの方法)

1. Rangeの「カンマ区切り」指定(手軽で速い)

文字列の中で、複数のセルや範囲を「カンマ」で並べます。これで「非連続の集合」をひとつのRangeとして扱えます。

' 離れた単一セルをまとめて参照
Range("A1, C2, D5").Value = 10

' 単一セルと範囲を混在
Range("A1, C3:D5").Interior.Color = vbCyan
VB

Range(“A1, C3:D5”).Value = 10 のように、カンマ区切りで複数の範囲をまとめて値や書式を一括適用できます

2. Union関数で結合(柔軟で応用向き)

Unionは複数のRangeを「結合」して、ひとつのRangeにします。動的に組み合わせるときや、変数のRangeをまとめたいときに便利です。

Sub UseUnion()
    Dim r1 As Range, r2 As Range, r3 As Range, rAll As Range
    Set r1 = Range("A1:C5")
    Set r2 = Columns("E")      ' E列全体
    Set r3 = Range("G1:H10")
    Set rAll = Union(r1, r2, r3)
    
    ' 結合した全範囲に一括で処理
    rAll.Font.Bold = True
    rAll.Interior.Color = vbYellow
End Sub
VB
  • ポイント: Unionは同一シート内の範囲同士で使う(複数シートにまたがる結合は不可)。
  • 使いどころ: 条件によって追加する範囲が変わるとき、可読性を保ちながら一括処理したいとき。

例題で理解する(連続+離れたセルを同時処理)

例題1:複数行の水平帯+単一セルを一度に選択して色付け

Sub PaintBands()
    ' 連続範囲の行帯+単一セルを同時に参照(Selectは不要)
    Dim r As Range
    Set r = Range("B2:F2, B4:F4, B6")   ' B2:F2、B4:F4、B6 の集合
    r.Interior.Color = vbGreen
End Sub
VB

B2:F2、B4:F4、B6 などをカンマ区切りで列挙すれば、離れた範囲を同時に指定できます。

例題2:Unionで列・行・ブロックをまとめて書式設定

Sub FormatMixedAreas()
    Dim rCols As Range, rRows As Range, rBlock As Range, rAll As Range
    Set rCols = Range("F:H")   ' F~H列
    Set rRows = Rows("4:6")    ' 4~6行
    Set rBlock = Range("B3:E8")
    Set rAll = Union(rCols, rRows, rBlock)
    
    With rAll
        .Borders.LineStyle = xlContinuous
        .Font.Size = 12
        .Interior.Color = RGB(255, 245, 200)
    End With
End Sub
VB

Unionは複数のRangeを受け取り、ひとつの複合Rangeを返します。同じ処理を一回書くだけで全範囲に適用でき、保守性が上がります。


複数選択(Ctrl+クリック)の個別処理

シート上でCtrlを押しながら離れた範囲を選択すると、選択は「複数エリア」として保持されます。VBAでは Selection.Areas を使って、各エリアを順番に処理できます。

Sub NumberAreas()
    Dim idx As Long
    For idx = 1 To Selection.Areas.Count
        ' 各エリアに識別用の文字を入れる
        Selection.Areas(idx).Value = "ブロック" & idx
    Next idx
End Sub
VB
  • Areasとは: 現在の選択に含まれる「非連続の範囲」ひとつひとつを表すコレクション。
  • 使い方の型: Areas.Countで数を調べ、Forループで Areas(i) を処理。

よくある落とし穴とコツ

  • Select/Activateを極力使わない: Rangeを変数に入れて直接処理すると速く、安定します。
  • 同一シートでまとめる: UnionやRangeのカンマ指定は同じワークシート内の範囲を前提にする。
  • 一括代入は高速: ValueやInteriorなどのプロパティは「集合」に対して一度で適用できる。配列で読み書きするとさらに高速化。
  • 読み取り時はVariant配列: 連続範囲は Dim v As Variant: v = Range("A1:C3").Value で2次元配列として取得できる。非連続はエリアごとに配列化する。
  • 可読性優先: カンマ区切りは手軽、Unionは動的構築に強い。状況で使い分ける。

もう少し踏み込みたい部分(例:配列での高速読み書き、条件で範囲を作る、名前付き範囲の併用など)があれば、やりたいことを具体的に教えて。あなたの用途に合わせて最短ルートで組み立てます。

VBA
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました