和風スパゲティのレシピ

日本語でコーディングするExcelVBA

複数のセル範囲が選択されているか判定する

選択セル(Selection)が複数のセル範囲を含むか判定するには、
RangeオブジェクトのAreasプロパティを使用します。

' Selectionが単一範囲の時にのみマクロを実行する
If Selection.Areas.Count = 1 Then
    ' ここに実行したい処理
End If

 
RangeオブジェクトのAreasプロパティを使用すると、
Range内の複数セル範囲をひとつずつ分けて取り出すことができます。

Dim 親Range As Range
Set 親Range = Range("A1,B2:C2,D4:E10")

Dim 各セル範囲 As Range
For Each 各セル範囲 In Selection.Areas
    Debug.Print 各セル範囲.Address
Next

このコードを実行すると、「A1」「B2:C2」「D4:E10」が表示され、
3つのエリアをループできていることが分かります。

1セルずつではなくエリアごとにループしたい場合はこちらを使用してください。


このAreasプロパティはCountプロパティを持っていますので、
エリアを複数持つかどうかはこのCountが1かどうかで判定できます。

ユーザーが選択した範囲に実行するマクロを作るときなどに、
1エリアだけを選択しているか判定する場合はこのコードを使用してください。


また、複数エリアのうち第1セル範囲のみに処理をする場合は、

Dim 親Range As Range
Set 親Range = Range("A1","B2:C2","D4:E10")

Dim 処理Range As Range
Set 処理Range = 親Range.Areas(1)

このようにAreas(1)という記述で第1エリアを取得できます。

選択範囲がひとつの時にも当然動きますので、
この場合は特に判定文は不要です。

おまけ:Instr関数を使用する方法

本処理には専用のAreasプロパティがあるため不要ですが、
別解としてInstr関数を使用する方法があります。


複数のセル範囲を含むRangeオブジェクトの特徴として、
セルアドレスに「A1,B1」のように「カンマ,」を必ず含みます。

これをInstr関数で判定してもOKです。

' Selectionが単一範囲の時にのみマクロを実行する
If Instr(Selection.Address, ",") = 0 Then
    ' ここに実行したい処理
End If

今回はわざわざこちらの方法を使用する必要はありませんが、
アドレス文字列を調べる方法も便利なことがあるため覚えておきましょう。