VBAテクニック集 VBA一覧 その他の知識 プロパティ・メソッド解説

【VBA】CurrentRegionの使い方|空白セルで範囲が途切れる原因と対処法を解説

VBAで表全体を処理したいとき、範囲を固定で指定するのではなく、データのある範囲を自動取得したい場面は多くあります。

そのようなときによく使われるのが、CurrentRegionプロパティです。

例えば、次のような処理で利用されます。

  • 表全体をコピーする
  • データ範囲をまとめて並べ替える
  • フィルターを設定する
  • 集計対象の表を取得する
  • CSVデータ全体を読み込む

しかし、CurrentRegionは非常に便利な反面、「途中に空白行や空白列がある」と想定していた範囲を取得できないことがあります。

「データはまだ続いているのに、途中までしか取得されない」

というトラブルは、CurrentRegionを使い始めたばかりの方がよく経験するポイントです。

この記事では、CurrentRegionの基本的な使い方から、空白セルによって範囲が変わる仕組みまで、実務目線で詳しく解説します。

✅ CurrentRegionとは

CurrentRegionは、指定したセルを中心として、上下左右に連続しているデータ範囲を取得するプロパティです。

例えば次のような表があるとします。

社員番号氏名部署
1001田中営業
1002佐藤総務
1003鈴木開発

この表でA1セルを基準にCurrentRegionを取得すると、

A1:C4

が取得されます。

コードは次のようになります。

Option Explicit

Sub GetCurrentRegion()

    Dim targetWorksheet As Worksheet
    Dim dataRange As Range

    Set targetWorksheet = ThisWorkbook.Worksheets("売上一覧")

    Set dataRange = targetWorksheet.Range("A1").CurrentRegion

    dataRange.Select

End Sub

このコードでは、A1セルから連続しているデータ全体を取得しています。

・CurrentRegionを使うメリット

CurrentRegionを利用すると、毎回セル範囲を書き換える必要がありません。

例えば固定範囲で指定すると、

Range("A1:C500")

のようになります。

しかし、データ件数は毎回変わるとは限りません。

100件の日もあれば、

500件の日もあります。

固定範囲で指定すると、

  • 不要な空白セルまで処理する
  • データが増えると最後まで処理できない

という問題が起こります。

一方、CurrentRegionなら、

Range("A1").CurrentRegion

だけで現在の表全体を取得できます。

データ件数が増減してもコードを書き換える必要がないため、実務では非常によく利用されています。


✅ CurrentRegionはどのように範囲を判断しているのか

CurrentRegionは、

「空白行または空白列で囲まれた一つの表」

を1つの範囲として認識しています。

例えば、

A列   B列   C列

社員番号 氏名 部署
1001    田中 営業
1002    佐藤 総務
1003    鈴木 開発

このように途中へ空白がなければ、

CurrentRegionは表全体を取得します。

しかし、

社員番号 氏名 部署
1001    田中 営業

1002    佐藤 総務
1003    鈴木 開発

途中へ空白行が入ると、

CurrentRegionはそこで範囲が終了したと判断します。

つまり、

A1:C2

までしか取得されません。

これがCurrentRegionで最も多いトラブルです。

・CurrentRegionは「最終行」を探しているわけではない

初心者の方は、

CurrentRegion

「最終行を取得する命令」

だと思ってしまうことがあります。

しかし、実際にはそうではありません。

CurrentRegionが見ているのは、

データが連続している領域

です。

例えば、

A列

100
200
300


400
500

このようなデータなら、

CurrentRegionは

A1:A3

しか取得しません。

途中の空白行によって、

「ここで表が終わった」

と判断するからです。

つまり、

最終行を取得したいのであれば、

Cells(Rows.Count, "A").End(xlUp).Row

のような方法とは役割が異なります。

CurrentRegionは、

「表全体を取得する」

ためのプロパティと考えると理解しやすくなります。


✅ CurrentRegionが向いている場面

CurrentRegionは、

表形式でデータが管理されているExcelでは非常に便利です。

例えば、

  • 売上一覧
  • 社員一覧
  • 商品マスター
  • 顧客一覧

のような、

途中に空白行が入らないデータに向いています。

そのようなデータなら、

コピー、

並べ替え、

フィルター、

集計、

書式設定など、

ほとんどの操作をCurrentRegionだけで行えます。

・CurrentRegionで表全体をコピーする

実務では、

取得したCurrentRegionをそのままコピーするケースもよくあります。

CurrentRegionで取得した表を繰り返し処理する場合は、セルを1つずつ参照するのではなく、範囲を配列へまとめて格納する方法も有効です。大量データを高速に処理する方法は【VBA】範囲指定のセルの値を配列に格納する方法|処理速度と保守性を両立する実務設計で詳しく解説しています。

・表全体を取得してコピーする構成にする理由

固定範囲でコピーすると、

データ件数が変わるたびに修正が必要になります。

CurrentRegionなら、

現在の表全体を取得してからコピーできるため、

毎月データ件数が変わる帳票でも流用しやすくなります。

Option Explicit

Sub CopyCurrentRegion()

    Dim sourceWorksheet As Worksheet
    Dim destinationWorksheet As Worksheet
    Dim sourceRange As Range

    Set sourceWorksheet = ThisWorkbook.Worksheets("売上一覧")
    Set destinationWorksheet = ThisWorkbook.Worksheets("集計")

    Set sourceRange = sourceWorksheet.Range("A1").CurrentRegion

    sourceRange.Copy _
        Destination:=destinationWorksheet.Range("A1")

End Sub

このコードでは、

CurrentRegionで取得した範囲全体をそのままコピーしています。

データ件数が増えても、

コードを変更する必要はありません。

また、

コピー元・コピー先ともにWorksheet変数で管理しているため、

SelectActivateに依存せず、安全に処理できます。

空白行や空白列のない一覧データを継続的に扱う場合は、通常範囲ではなくExcelテーブルとして管理する方法も有効です。VBAで表をテーブル化するListObjects.Addメソッドの使い方は【VBA】テーブル作成を自動化するListObjects.Addメソッド完全ガイドで解説しています。


✅ CurrentRegionを使う前に確認しておきたいこと

CurrentRegionは便利ですが、

次のような表では期待どおり動かない場合があります。

  • 空白行が途中へ入る
  • 空白列で区切られている
  • 表が複数並んでいる
  • メモ欄が途中へ入っている

つまり、

CurrentRegionは

「見た目が表」

ではなく、

「連続したデータ」

を取得しています。

そのため、

レイアウトを重視して空白行を入れているExcelでは、

思わぬ範囲しか取得できないことがあります。

CurrentRegionを利用する前には、

対象となるデータが本当に連続しているかを確認することが重要です。


✅ 空白行・空白列がある場合の動作

CurrentRegionは、基準セルの周囲にある連続したデータ範囲を取得します。

ここで注意したいのは、空白セルが1つあるだけで必ず範囲が途切れるわけではないという点です。

例えば、表の途中に一部の未入力セルがあっても、その行や列のほかのセルにデータが入っていれば、同じ範囲として取得されることがあります。

CurrentRegionを分断する主な原因は、次の2つです。

  • 行全体が空白になっている
  • 列全体が空白になっている

つまり、個別の空白セルよりも、表を横断する空白行や空白列の影響が大きくなります。

・途中に空白行がある場合

次のような表を考えてみます。

A列B列C列
商品コード商品名金額
A001商品A1,000
A002商品B2,000
A003商品C3,000

3行目が完全な空白行になっている場合、A1セルを基準にしたCurrentRegionは、基本的に上側の表だけを取得します。

Set dataRange = targetWorksheet.Range("A1").CurrentRegion

この場合、取得されるのはA1:C2です。

空白行より下にデータがあっても、CurrentRegionから見ると別の領域として扱われます。

・途中に空白列がある場合

空白列でも同様です。

A列B列C列D列
商品コード商品名金額
A001商品A1,000
A002商品B2,000

C列が完全に空白の場合、A1セルを基準にしたCurrentRegionには、D列の金額が含まれません。

取得される範囲はA1:B3です。

見た目では同じ一覧表に見えても、CurrentRegionでは空白列の左右が別々の表として認識されます。

CurrentRegionで表全体を取得したい場合は、処理前に不要な空白行を削除してデータを連続させる方法もあります。Rows.Deleteを使って空白行を安全に削除する方法は【VBA】行を削除する方法|Rows.Deleteで空白行をまとめて処理をご覧ください。


 

✅ 一部のセルだけ空白ならどうなるのか

次のように、B3セルだけが空白になっている場合を考えます。

商品コード商品名金額
A001商品A1,000
A0022,000
A003商品C3,000

この場合は、行全体や列全体が空白ではありません。

そのため、A1セルのCurrentRegionでは、通常A1:C4まで取得できます。

Set dataRange = targetWorksheet.Range("A1").CurrentRegion

CurrentRegionを使用するときは、「空白セルがあるか」だけで判断するのではなく、空白が表を完全に分断しているかを確認することが大切です。


✅ CurrentRegionが期待どおり取得できない主な原因

CurrentRegionの取得結果が想定と異なる場合は、コードだけでなく、対象シートの構造を確認する必要があります。

代表的な原因を見ていきましょう。

・基準セルが表の外にある

CurrentRegionは、指定した基準セルを含む連続範囲を取得します。

そのため、表の外にある空白セルを基準にすると、目的の表を取得できません。

Set dataRange = targetWorksheet.Range("A1").CurrentRegion

A1セルが表の一部であれば問題ありません。

しかし、実際の表がA5から始まっていて、A1からA4までが空白の場合は、A1を基準にしても表全体は取得できません。

その場合は、表の内部にあるセルを指定します。

Set dataRange = targetWorksheet.Range("A5").CurrentRegion

見出しの左上セルなど、必ず表に含まれるセルを基準にすると安全です。

・見出しの上や表の左側に別データがある

CurrentRegionは、対象セルの上下左右に連続している範囲を取得します。

そのため、表の近くにタイトルや集計値が隙間なく配置されていると、それらも同じ範囲に含まれる場合があります。

例えば、A1に帳票タイトルがあり、A2以降へ表が続いている場合、タイトルと表の間に空白行がなければ、A1もCurrentRegionに含まれます。

処理対象を明細部分だけにしたい場合は、CurrentRegion取得後に見出しやタイトルを除外する必要があります。

・数式で空文字が表示されている

見た目では空白でも、数式が入力されているセルは完全な空白セルではありません。

例えば、次の数式です。

=IF(A2="","",B2*C2)

結果が空文字列になっていても、セル自体には数式が存在します。

そのため、CurrentRegionではデータが入っているセルとして扱われ、範囲が連続することがあります。

「画面上では空白に見えるのに、CurrentRegionがそこで止まらない」という場合は、数式の有無も確認しましょう。

空白行や数式によって範囲取得が想定とずれる場合は、CurrentRegionだけでなく、最終行の取得方法にも注意が必要です。空白・数式・UsedRangeが原因で最終行を正しく取得できないケースは【VBA】最終行を取得できない原因とは|空白・数式・UsedRangeの落とし穴で整理しています。


✅ CurrentRegionとUsedRangeの違い

CurrentRegionと混同されやすいものに、UsedRangeがあります。

どちらも範囲を自動取得できますが、役割は異なります。

項目CurrentRegionUsedRange
基準指定セルを含む連続範囲シート内で使用された範囲
空白行・空白列範囲が分断される内側の空白も含まれる
複数の表基準セル周辺の表だけ複数の表をまとめて含む
主な用途一覧表やデータベース形式の表シート全体の使用範囲確認

UsedRangeは、シート内で値や書式が使用された範囲をまとめて取得します。

Set dataRange = targetWorksheet.UsedRange

例えば、A1:C10とF1:H10に別々の表がある場合、UsedRangeはA1:H10を取得することがあります。

その間にあるD列やE列が空白でも、範囲全体に含まれます。

一方、A1セルからCurrentRegionを取得した場合は、A1:C10だけが対象になります。

・UsedRangeなら空白問題をすべて解決できるわけではない

CurrentRegionで範囲が途切れるからといって、単純にUsedRangeへ置き換えればよいとは限りません。

UsedRangeには、次のような特徴があります。

  • 不要な書式設定セルまで含むことがある
  • 過去に入力して削除したセルが範囲に残ることがある
  • 複数の表をまとめて取得してしまう
  • 表の開始位置や列構成を判断しにくい

そのため、1つの連続した表を処理するならCurrentRegion、シート全体の使用範囲を確認するならUsedRangeという使い分けが基本です。

CurrentRegionとUsedRangeは、どちらも範囲を自動取得できますが、判定基準は大きく異なります。UsedRangeで最終行・最終列を取得する方法や、不要な書式まで範囲に含まれる注意点については、【VBA】UsedRangeプロパティ:最終行と最終列数を取得する方法と実務での注意点で詳しく解説しています。


✅ 空白行があっても最終行まで取得する方法

途中に空白行がある一覧では、CurrentRegionよりも最終行と最終列を取得して範囲を組み立てる方法が適しています。

・CurrentRegionを使わず範囲を明示的に組み立てる

次のコードでは、A列を基準に最終行を取得し、1行目を基準に最終列を取得しています。

Option Explicit

Sub GetRangeIncludingBlankRows()

    Dim targetWorksheet As Worksheet
    Dim dataRange As Range
    Dim lastDataRow As Long
    Dim lastDataColumn As Long

    Set targetWorksheet = ThisWorkbook.Worksheets("売上一覧")

    ' A列を基準に最終行を取得する
    lastDataRow = targetWorksheet.Cells( _
        targetWorksheet.Rows.Count, "A" _
    ).End(xlUp).Row

    ' 1行目を基準に最終列を取得する
    lastDataColumn = targetWorksheet.Cells( _
        1, targetWorksheet.Columns.Count _
    ).End(xlToLeft).Column

    Set dataRange = targetWorksheet.Range( _
        targetWorksheet.Cells(1, 1), _
        targetWorksheet.Cells(lastDataRow, lastDataColumn) _
    )

    dataRange.Select

End Sub

この方法なら、途中に空白行があっても、A列の最終データ行まで範囲に含められます。

・この方法でも基準列の選び方が重要

最終行を取得するときにA列を使っていますが、A列に途中以降のデータが入らない可能性がある場合は注意が必要です。

例えば、最終行ではA列が空白で、B列やC列だけにデータがあると、A列基準では正しい最終行を取得できません。

実務では、次のような列を基準にします。

  • 必ず入力される管理番号列
  • 必須項目となっている日付列
  • 空白にならない商品コード列
  • レコードごとに必ず値が入る主キー列

最終行の取得方法は、シートの構造に合わせて決めることが重要です。

CurrentRegionを使わず、途中の空白行を含めて最終行まで範囲指定したい場合は、最終行を取得してRangeを組み立てる方法が適しています。具体的な指定方法は【VBA】範囲指定を最終行まで指定する方法|可変データに対応する実務テクニックも参考にしてください。

列数が固定されていない表では、最終行だけでなく最終列も自動取得する必要があります。右端のデータ列を取得して可変範囲を作る方法は【VBA】最終列を取得して範囲指定する方法|可変データに対応する実務テクニックで解説しています。


 

✅ Findメソッドで最終セルを取得する方法

複数列のどこに最終データがあるか分からない場合は、Findメソッドでシート全体の最終セルを探す方法もあります。

Option Explicit

Sub GetRangeByFindMethod()

    Dim targetWorksheet As Worksheet
    Dim lastUsedRowCell As Range
    Dim lastUsedColumnCell As Range
    Dim dataRange As Range
    Dim lastDataRow As Long
    Dim lastDataColumn As Long

    Set targetWorksheet = ThisWorkbook.Worksheets("売上一覧")

    Set lastUsedRowCell = targetWorksheet.Cells.Find( _
        What:="*", _
        After:=targetWorksheet.Range("A1"), _
        LookIn:=xlFormulas, _
        LookAt:=xlPart, _
        SearchOrder:=xlByRows, _
        SearchDirection:=xlPrevious, _
        MatchCase:=False _
    )

    Set lastUsedColumnCell = targetWorksheet.Cells.Find( _
        What:="*", _
        After:=targetWorksheet.Range("A1"), _
        LookIn:=xlFormulas, _
        LookAt:=xlPart, _
        SearchOrder:=xlByColumns, _
        SearchDirection:=xlPrevious, _
        MatchCase:=False _
    )

    If lastUsedRowCell Is Nothing Or _
       lastUsedColumnCell Is Nothing Then

        MsgBox "対象シートにデータがありません。", vbInformation
        Exit Sub

    End If

    lastDataRow = lastUsedRowCell.Row
    lastDataColumn = lastUsedColumnCell.Column

    Set dataRange = targetWorksheet.Range( _
        targetWorksheet.Cells(1, 1), _
        targetWorksheet.Cells(lastDataRow, lastDataColumn) _
    )

    dataRange.Select

End Sub

この方法では、特定の列だけに依存せず、シート内で最後に使用されている行と列を取得できます。

ただし、表の外側にメモや補助計算がある場合は、それらも範囲に含まれます。

CurrentRegionより柔軟ですが、何を表の終端とみなすかを明確にして使う必要があります。

Findメソッドは、最終セルの取得だけでなく、指定した文字列のセル位置を検索するときにも利用できます。Findを安全に使うための引数設定や設計上の注意点は【VBA】文字列のセル位置を検索する方法|Findの正しい使い方と設計思想をご覧ください。


✅ CurrentRegionを安全に使う実務向けコード

CurrentRegionを使う場合は、取得できた範囲が処理対象として妥当かを確認してから処理すると安全です。

次の例では、表に見出しと1件以上のデータがあるかを確認したうえでコピーします。

Option Explicit

Sub CopyCurrentRegionSafely()

    Dim sourceWorksheet As Worksheet
    Dim destinationWorksheet As Worksheet
    Dim sourceRange As Range
    Const HEADER_ROW_COUNT As Long = 1

    Set sourceWorksheet = ThisWorkbook.Worksheets("売上一覧")
    Set destinationWorksheet = ThisWorkbook.Worksheets("集計")

    Set sourceRange = sourceWorksheet.Range("A1").CurrentRegion

    ' 見出し行しかない場合は処理しない
    If sourceRange.Rows.Count <= HEADER_ROW_COUNT Then

        MsgBox "コピー対象のデータがありません。", vbInformation
        Exit Sub

    End If

    sourceRange.Copy _
        Destination:=destinationWorksheet.Range("A1")

    Application.CutCopyMode = False

End Sub

このコードでは、CurrentRegionを取得したあと、行数を確認しています。

A1セルだけに値が入っている場合や、見出しだけの表を誤ってコピーするのを防げます。

・Selectを使わずRange変数へ保存する

CurrentRegionのサンプルでは、動作確認のためにSelectを使うことがあります。

Range("A1").CurrentRegion.Select

しかし、実際の業務処理では、範囲を選択する必要がないケースがほとんどです。

そのため、次のようにRange型の変数へ保存して使う方が適しています。

Dim dataRange As Range

Set dataRange = targetWorksheet.Range("A1").CurrentRegion

この形なら、コピー・並べ替え・フィルター・配列への格納など、後続処理へそのまま利用できます。

また、アクティブシートや選択状態に依存しないため、処理が安定しやすくなります。

CurrentRegionで取得した範囲は、コピーだけでなく、セルの値を読み取ったり配列へ格納したりする処理にも利用できます。単一セル・複数セル・選択範囲から値を取得する方法は【VBA】セルの値を取得する方法|範囲指定・選択範囲・配列まで解説で解説しています。

CurrentRegionで取得した範囲は、Selectで選択しなくてもそのまま処理できます。選択状態に依存しないコードの考え方や、Selectを使わず安全にセルを操作する方法は【VBA】セルの選択を解除する方法|Selectを使わない高速・安全な実装まで解説も参考になります。


✅ CurrentRegionが向いている場面・避けた方がよい場面

CurrentRegionは、すべての表に適しているわけではありません。

・CurrentRegionが向いている表

  • 1行目に見出しがある
  • 途中に完全な空白行がない
  • 途中に完全な空白列がない
  • 1つの連続した一覧表になっている
  • データ件数が定期的に増減する

・CurrentRegionを避けた方がよい表

  • 空白行を区切りとして使用している
  • 項目の間に空白列がある
  • 同じシートに複数の表が隣接している
  • 表の途中にタイトルや注釈が入る
  • 複雑な帳票形式になっている

一覧データとして整った表にはCurrentRegionが向いています。

一方、見た目を重視した帳票や複雑なレイアウトでは、最終行・最終列を取得して範囲を明示的に組み立てる方が安全です。


✅ よくある失敗例と対策

CurrentRegionを使用するときによくある失敗を整理します。

・空白行より下のデータが処理されない

原因

途中の完全な空白行によって、CurrentRegionが分断されています。

対策

空白行を削除するか、最終行・最終列から範囲を組み立てます。

・隣の表まで一緒に取得される

原因

2つの表の間に完全な空白列がなく、連続した範囲として認識されています。

対策

表の間へ空白列を設けるか、対象列を明示してRangeを作成します。

・見出ししかないのに処理が実行される

原因

CurrentRegionは、見出しだけでも有効な範囲として返します。

対策

Rows.Countを確認し、データ行が存在する場合だけ処理します。

・空白に見えるセルで範囲が途切れない

原因

セルに数式やスペースが入力されています。

対策

数式、空文字列、半角・全角スペースの有無を確認します。

・Selectでエラーになる

原因

対象シートがアクティブになっていない状態で、別シートの範囲を選択しようとしています。

対策

実務コードではSelectを使わず、Range変数へ保存して直接処理します。

表の途中にある空白セルを整理して、連続したデータ範囲へ整えたい場合は、空白セルを削除して上詰めする方法もあります。ただし、行の対応関係が崩れないよう注意が必要です。⇒【VBA】空白セルを削除して上詰めする方法|実務で使える安全なデータ整理術


 

✅ まとめ:CurrentRegionは連続した表を取得するプロパティ

CurrentRegionは、基準セルを含む連続したデータ範囲を取得できる便利なプロパティです。

Set dataRange = targetWorksheet.Range("A1").CurrentRegion

データ件数が変わる一覧表でも、固定範囲を書き換えずに表全体を取得できます。

ただし、CurrentRegionは最終行を取得する機能ではありません。

空白行や空白列で囲まれた連続領域を判定しているため、途中に完全な空白行・空白列があると範囲が分断されます。

実務では、次のように使い分けることが重要です。

  • 連続した一覧表を取得する:CurrentRegion
  • シート内の使用範囲を取得する:UsedRange
  • 特定列を基準に最終行まで取得する:End(xlUp)
  • シート全体から最後のデータを探す:Find
  • 複雑な帳票を処理する:開始セルと終了セルを明示してRangeを作成する

CurrentRegionの特徴を理解せずに使うと、処理漏れや不要な範囲の取得につながります。

対象となる表の構造を確認し、空白行や空白列が存在する場合は、最終行取得など別の方法へ切り替えることが、安全で変更に強いVBA設計につながります。

    -VBAテクニック集, VBA一覧, その他の知識, プロパティ・メソッド解説