選択セル(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
今回はわざわざこちらの方法を使用する必要はありませんが、
アドレス文字列を調べる方法も便利なことがあるため覚えておきましょう。