- 1. 概要
- 2. CurrentRegionの基本動作
- 3. CurrentRegionの使い方
- 4. CurrentRegionの動作イメージ
- 5. CurrentRegionで取得できる範囲の特徴
- 6. 実務でのよくある利用例
- 7. CurrentRegionの制限と注意点
- 8. CurrentRegionの内部動作(Excelの動作に準拠)
- 9. CurrentRegionとUsedRangeの違い
- 10. 例:データの自動集計処理にCurrentRegionを利用
- 11. CurrentRegionを使ったデータ範囲の拡張
- 12. 空白セルの影響によるCurrentRegionの意図しない結果への対処
- 13. CurrentRegionの実践的な応用例
- 14. まとめ
1. 概要
VBAのRangeオブジェクトのCurrentRegion
プロパティは、指定したセルを中心に、そのセルを囲む隣接した連続範囲(データの塊)を表すRangeオブジェクトを返します。
Excelの「現在の領域」に相当し、特にデータが表形式で連続して入力されている範囲の操作や解析に非常に便利です。
例として、データテーブルの中の任意のセルを基点として、そのテーブル全体の範囲を一括で取得できます。
2. CurrentRegionの基本動作
- 指定したセルを含み、その周囲に隣接している非空セルの範囲全体を矩形で取得します。
- つまり、空白行・空白列で区切られた連続データの塊(リージョン)を取得するイメージです。
- 空白セルや空白行・空白列があるとそこで領域が区切られます。
- 連続しているセル群が矩形の範囲として返されます。
3. CurrentRegionの使い方
Dim rng As Range
Set rng = Range("B2").CurrentRegion
この例では、セルB2
を基点にして、そのセルを囲む連続したデータ範囲全体をrng
に取得します。
4. CurrentRegionの動作イメージ
たとえば以下のような表で
A | B | C | D | E |
---|---|---|---|---|
1 | 2 | 3 | ||
4 | 5 | 6 | ||
7 | 8 | 9 | ||
10 | 11 | 12 | 13 | 14 |
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の違い
項目 | CurrentRegion | UsedRange |
---|---|---|
範囲取得の基準 | 指定セルを中心とした隣接した連続セルの範囲 | シート全体の使用中セルの最小矩形範囲 |
空白セルの扱い | 空白行・空白列で区切る | 使用されたセル全てを含む |
用途 | データ表の単位の抽出 | ワークシート全体の使用範囲把握 |
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列だけ余分に範囲を拡張したいときは、Resize
やOffset
と組み合わせます。
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は区切られてしまうので、
次のようにUsedRange
やFind
メソッドでデータ範囲を補う方法があります。
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は隣接範囲 |