CurrentRegion オブジェクトRangeプロパティ

Range

1. 概要

VBAのRangeオブジェクトのCurrentRegionプロパティは、指定したセルを中心に、そのセルを囲む隣接した連続範囲(データの塊)を表すRangeオブジェクトを返します。

Excelの「現在の領域」に相当し、特にデータが表形式で連続して入力されている範囲の操作や解析に非常に便利です。

例として、データテーブルの中の任意のセルを基点として、そのテーブル全体の範囲を一括で取得できます。


2. CurrentRegionの基本動作

  • 指定したセルを含み、その周囲に隣接している非空セルの範囲全体を矩形で取得します。
  • つまり、空白行・空白列で区切られた連続データの塊(リージョン)を取得するイメージです。
  • 空白セルや空白行・空白列があるとそこで領域が区切られます。
  • 連続しているセル群が矩形の範囲として返されます。

3. CurrentRegionの使い方

Dim rng As Range
Set rng = Range("B2").CurrentRegion

この例では、セルB2を基点にして、そのセルを囲む連続したデータ範囲全体をrngに取得します。


4. CurrentRegionの動作イメージ

たとえば以下のような表で

ABCDE
123
456
789
1011121314
  • Range("B2").CurrentRegionはA1:C3の範囲を返します。
    ※ B2は2行2列目のセルで、そこから連続してデータのある範囲を矩形で取得。
  • Range("A5").CurrentRegionはA5:E5の範囲を返します(5行目の連続データ)。

5. CurrentRegionで取得できる範囲の特徴

特徴内容
連続セルで矩形範囲行・列ともに連続した非空セルの矩形領域
空白行・空白列で区切られる空白行や空白列を境に領域が分割される
1セルだけの場合もある周囲に空白セルがあれば単一セルの範囲になることもある
複数セルの範囲として返る常にRangeオブジェクト(1セル以上のセルの集まり)を返す

6. 実務でのよくある利用例

1)表全体の範囲を取得して操作

Dim dataRange As Range
Set dataRange = Range("A1").CurrentRegion

' 例: 表のセルに枠線をつける
With dataRange.Borders
.LineStyle = xlContinuous
.Weight = xlThin
End With

2)表の行数・列数を取得する

Dim dataRange As Range
Set dataRange = Range("B2").CurrentRegion

MsgBox "行数: " & dataRange.Rows.Count & vbCrLf & _
"列数: " & dataRange.Columns.Count

3)表のデータ全体をループ処理する

Dim dataRange As Range
Dim r As Range, c As Range

Set dataRange = Range("A1").CurrentRegion

For Each r In dataRange.Rows
For Each c In r.Cells
Debug.Print c.Address, c.Value
Next c
Next r

7. CurrentRegionの制限と注意点

1)空白行や空白列で範囲が区切られる

CurrentRegionは、セルを囲む範囲が連続したセルの塊を前提にしているため、途中に空白行や空白列があると、そこで領域が分割されます。
つまり空白があるとそこから先は含みません。

2)テーブルが途切れ途切れのデータだと意図しない範囲になる

不規則なデータ構造だと、意図した範囲が取得できないことがあります。


8. CurrentRegionの内部動作(Excelの動作に準拠)

CurrentRegionはExcelの「ジャンプ(Ctrl + Shift + 8)」に相当する動作です。
そのセルを囲む隣接セルのブロックを矩形範囲として取得しています。


9. CurrentRegionとUsedRangeの違い

項目CurrentRegionUsedRange
範囲取得の基準指定セルを中心とした隣接した連続セルの範囲シート全体の使用中セルの最小矩形範囲
空白セルの扱い空白行・空白列で区切る使用されたセル全てを含む
用途データ表の単位の抽出ワークシート全体の使用範囲把握

10. 例:データの自動集計処理にCurrentRegionを利用

Sub 集計処理()
Dim dataRange As Range
Dim lastRow As Long

Set dataRange = Range("A1").CurrentRegion

lastRow = dataRange.Rows.Count

MsgBox "データ範囲は " & dataRange.Address & " です。行数は " & lastRow

' 例えば、データ範囲の最終行に合計を入れる
dataRange.Cells(lastRow + 1, 1).Value = "合計"
dataRange.Cells(lastRow + 1, 2).Formula = "=SUM(" & dataRange.Columns(2).Address & ")"
End Sub

11. CurrentRegionを使ったデータ範囲の拡張

例えばCurrentRegionを起点に、1行または1列だけ余分に範囲を拡張したいときは、ResizeOffsetと組み合わせます。

Dim region As Range
Set region = Range("B2").CurrentRegion

' 1行拡張
Set region = region.Resize(region.Rows.Count + 1, region.Columns.Count)

' 1列拡張
Set region = region.Resize(region.Rows.Count, region.Columns.Count + 1)

12. 空白セルの影響によるCurrentRegionの意図しない結果への対処

データが途中で空白になっている場合、CurrentRegionは区切られてしまうので、
次のようにUsedRangeFindメソッドでデータ範囲を補う方法があります。


13. CurrentRegionの実践的な応用例

複数のテーブルがあるシートでの自動範囲検出

Sub 複数テーブル処理()
Dim c As Range
Dim processed As Collection
Dim ws As Worksheet
Dim region As Range

Set ws = ActiveSheet
Set processed = New Collection

' シートのUsedRange内のセルを1つずつチェック
For Each c In ws.UsedRange.Cells
On Error Resume Next
Set region = c.CurrentRegion
If Err.Number = 0 Then
' 同じ範囲を処理済みでなければ処理
If Not IsInCollection(processed, region.Address) Then
' 何らかの処理
Debug.Print "処理範囲: " & region.Address
processed.Add region.Address, region.Address
End If
End If
On Error GoTo 0
Next c
End Sub

Function IsInCollection(col As Collection, key As String) As Boolean
On Error Resume Next
Dim v
v = col(key)
IsInCollection = (Err.Number = 0)
Err.Clear
On Error GoTo 0
End Function

14. まとめ

ポイント内容
CurrentRegionの役割指定セルを含む連続した非空セルの矩形範囲を取得
空白行・空白列で区切られる途中の空白で領域が区切られるため注意が必要
使い方の基本Range("A1").CurrentRegionで範囲を簡単に取得できる
用途例表全体の書式設定、行数・列数取得、ループ処理など
UsedRangeとの違いUsedRangeはシート全体の使用範囲、CurrentRegionは隣接範囲
タイトルとURLをコピーしました