和風スパゲティのレシピ

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

表の範囲を推定して取得する - CurrentRegion

Excelには表のエリアを推定して選択する機能があり、
Ctrl+Aで実行することができます。

CurrentRegion(アクティブセル領域)

この範囲のことを「アクティブセル領域」と呼び、
Ctrl+Aのショートカットは

  • 1度押すとアクティブセル領域
  • さらにもう一度押すとシート全体

を選択するショートカットになります。


この機能をVBAから呼び出してRangeオブジェクトを取得するには、
CurrentRegion(カレントリージョン)プロパティを使用します。

基本構文

Dim 表エリア As Range
Set 表エリア = 基準セル.CurrentRegion

サンプルコード

' 表全体に格子罫線を引く
Range("B3").CurrentRegion.Borders.LineStyle = True

' 表全体を別シートにコピー
Range("B3").CurrentRegion.Copy Worksheets("○○").Range("A1")

' 表エリアのデータ部分だけを取得
Dim 表のデータ部分 As Range
Set 表のデータ部分 = Range("B3").CurrentRegion
Set 表のデータ部分 = 表のデータ部分.Offset(1)
Set 表のデータ部分 = 表のデータ部分.Resize(表のデータ部分.Rows.Count - 1)

解説

RangeオブジェクトのCurrentRegionプロパティを実行すると、
そのセルを含む表エリアを推定して取得することができます。

この画像でB3~E9のどのセルから実行してもB3:E9を取得します。

CurrentRegion(アクティブセル領域)


取得する範囲には見出し行が含まれていることが多いため、
データ部分だけを取得したい場合はサンプルのようにOffset/Resizeを使用し、
ひとつ下にズラした後、行数を1減らして見出し行を除外してください。

CurrentRegionの仕様と注意点

CurrentRegionはとても便利なメソッドですが、
Excelによる推定であるため挙動が完全には安定しないことに注意してください。

まず仕様として、推定といってもそんな複雑な判定を行っているわけではなく、
値でつながっている(≒空行・空列で区切られた)エリアを単純に取得します。


よって一番注意しなければいけないのは、
このような表で見出し行上部を含めて取得してしまう点です。

CurrentRegionがタイトル行を取得してしまう

ちょっとした表タイトルや注釈などがあるだけでも、
見出しの1行上まで取ってきてしまう点には十分注意してください。


この現象はマクロ完成後の運用中に注釈を書いてももちろん発生します。

よってCurrentRegionでは完全に安定なマクロを作ることはできませんので、
利用するのは簡易なマクロをサッと書くときに留めた方が無難です。


より安定に表エリアを取得する方法として、

  • フィルター設置エリアを取得するAutoFilter.Range
  • テーブル設置エリアを取得するListObject.Range

あたりを活用できますのでこちらの使用を検討してください。


また、この仕様を改良した改良型のCurrentRegionを作成してみました。

よろしければこちらの関数も使用してみてください。

準備中