【VBAリファレンス|実務向け】セル領域の操作-複数のセル領域(Areasプロパティ)|Excel VBA

スポンサーリンク

なぜAreasプロパティが重要なのか

実務でExcel VBAを扱っていると、Ctrlキーを押しながら複数のセル範囲を選択したり、あるいは「ジャンプ機能」で空白セルだけを一括選択したりすることがあります。このように、連続していない複数のセル領域(飛び飛びの範囲)を扱う際、単純に「Rows.Count」や「Columns.Count」を使うと、最初の領域のサイズしか取得できないという罠に陥ります。この課題を解決し、すべての領域の合計値を正確に計算するために不可欠なのが「Areasプロパティ」です。

基礎知識:Areasとは何か

Excel VBAにおいて、複数の領域で構成されるRangeオブジェクトは、内部的に「Areasコレクション」を持っています。
・Rangeオブジェクト:セルやセルの範囲を表すオブジェクト。
・Areasプロパティ:選択範囲に含まれる「離れた領域」を個別のRangeオブジェクトの集まりとして返します。

注意点として、単一のセル範囲しか選択されていない場合でも、Areasは1つの領域として認識されます。この性質をループ処理と組み合わせることで、複雑な範囲指定に対しても柔軟な操作が可能になります。

実装の考え方

複数の領域を扱う際の鉄則は、「AreasコレクションをForループで回す」ことです。
1. 対象となる範囲を特定する。
2. Areas.Countで、いくつの独立した領域があるかを判定する。
3. Forループを使い、各領域(Areas(i))に対して個別に操作(行数のカウントなど)を行う。
これにより、意図した通りの集計や値の書き込みが可能になります。

サンプルプログラム:飛び飛びの領域の行・列数を合計する

以下のコードは、飛び飛びの範囲を選択した状態で実行すると、それぞれの行数と列数を合算して表示する実用的な例です。

Sub CountMultipleAreas()
‘ 変数の宣言
Dim i As Long
Dim totalRows As Long
Dim totalCols As Long
Dim targetRange As Range

‘ 対象となる複数の領域を設定(例:離れた3つの範囲)
Set targetRange = Range(“A1:D3, F7:G11, I12:K17”)

‘ 各領域をループして行数と列数を加算
‘ .Areas.Count で領域の個数を取得
For i = 1 To targetRange.Areas.Count
‘ .Areas(i) で各領域にアクセス
totalRows = totalRows + targetRange.Areas(i).Rows.Count
totalCols = totalCols + targetRange.Areas(i).Columns.Count
Next i

‘ 結果をメッセージボックスで出力
MsgBox “選択範囲内の合計行数:” & totalRows & vbCrLf & _
“選択範囲内の合計列数:” & totalCols, vbInformation, “集計完了”
End Sub

応用と注意点

現場でよくある失敗として、「Areasを意識せずにRange全体に対して処理をしてしまう」ケースが挙げられます。特に「データの最終行を取得したい」という時に、Areasが複数あると意図しない結果を返すことが多々あります。

また、Areasは「選択範囲(Selection)」に対しても非常に有効です。ユーザーがマクロを実行する前に任意の場所をCtrlキーで複数選択していた場合、Selection.Areasを使うことで、ユーザーの選択範囲すべてに対して一括で書式設定を変更したり、値をクリアしたりする便利なツールが作成できます。

バグ回避のコツ:
もし処理対象が単一の範囲なのか、複数の範囲が含まれているのか不明な場合は、あらかじめ「If targetRange.Areas.Count > 1 Then …」と条件分岐を入れておくと、予期せぬ動作を防ぐ堅牢なコードになります。ぜひ現場の業務効率化に役立ててください。

タイトルとURLをコピーしました