🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

Excel VBA の CurrentRegion — データブロック全体を 1 行で取得する(そして空白行がそれに何をするのか)

|

Excel VBA の CurrentRegion — データブロック全体を 1 行で取得する(そして空白行がそれに何をするのか)

TL;DRCurrentRegion は、あるセルを囲むセルの連続ブロックです。Excel はあなたの セルから始めて外へ広がり、完全に空白の行と完全に空白の列にぶつかるまで拡張して、その 途切れない島を囲む最小の長方形を返します — Ctrl+Shift+* で選択されるものと同じです。端は 計算しません。Excel が見つけます。罠は、たった 1 本の完全に空白の行または列が壁となって ブロックを静かに分断することで、エラーもなくデータの半分だけが返ってくることがあります。 見出し行も含まれるので、OffsetResize で 落としましょう。

Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets("Data")
Dim block As Range
Set block = ws.Range("A1").CurrentRegion        ' A1 を囲む表全体、見出しを含む
' データだけ - 見出しの先へ動かし、高さを 1 縮める:
Dim body As Range
Set body = block.Offset(1, 0).Resize(block.Rows.Count - 1, block.Columns.Count)

CurrentRegion は、"A1:D100" のベタ書きへの特効薬です。データがどこで終わるかを計算する 代わりに、Excel がすでに見えているブロックを渡してもらいます。本記事は、これを信頼できるものに する 1 つの考えを軸にしています。CurrentRegion は空白の端で定義されるので、その信頼性は データがどれだけきれいかで決まる。 これを押さえれば、その威力(1 行で表をつかむ)も、その 失敗モード(1 本の空白行が半分に切る)も、どちらも同じルールから来ていることが分かります。

この記事で学べること

  • 考え方の軸 — Excel はあなたのセルから空白の端まで広がる
  • 最も大事なルール — 完全に空白の行や列は壁
  • CurrentRegion が見出しを含む理由と、その落とし方
  • UsedRangeEnd(xlUp) との違い
  • ブロックの中のどのセルからでも、一度でつかむ
  • CurrentRegion を信頼してよいとき — そして代わりに本物のテーブルを使うとき

考え方の軸:Excel は空白の端まで広がる

CurrentRegion は「このセルを囲むデータのブロックは何か?」に答えます。Excel はあなたが 名指ししたセルから始め、長方形をあらゆる方向へ外へ広げ、まるまる 1 行と 1 列の空白がそれを 閉じ込めたときだけ止まります。

' A1:D101 が空のセルに囲まれた隙間のない表なら、これは A1:D101:
Set block = ws.Range("A1").CurrentRegion

これは、表の中をクリックして Ctrl+Shift+*(または Ctrl+A を 1 回)を押すことのコード版 です — Excel はあなたが立っている島を選択します。重要な帰結は、境界が宣言されるのではなく、 発見されることです。最終行や最終列を書くことは決してないので、参照は前回見たときから増減した データに自動で合います。それがこの機能の魅力のすべてで、次のルールがその代償です。

最も大事なルール:空白の行や列は壁

ブロックは空白で区切られるので、たった 1 本の完全に空白の行や列がそれをぴたりと止めます。 データの真ん中に空の行が 1 つあると、CurrentRegion はその上の部分だけを返します — 静かに、 エラーもなく。

' 1-50 行は埋まり、51 行目は全体が空白、52-100 行は埋まっている:
Set block = ws.Range("A1").CurrentRegion   ' A1:D50 だけを返す - 下半分は失われる

逆もまた噛みつきます。1 マス離れたところにある迷子の値が引き込まれ、本当のデータを越えて範囲が ふくらみます。これを壊さないのは、ブロック内のたった 1 つの空のセルです — 行の中の欠損値 1 つは問題なく、まるまる空白の行や列だけが壁として働きます。ですから CurrentRegion は、きれいで 隙間のない表にはぴったり正しく、小計の隙間・間隔用の行・空白の仕切り列があるシートにはぴったり 間違っています。ブロックが違うサイズで返ってきたら、ほかの何かを疑う前に、内側の空白を探し ましょう。

CurrentRegion は見出しを含む — その落とし方

CurrentRegion は見出し行をデータと一緒に返します。これが、ループが「タイトルをレコードとして 処理してしまった」第 1 位の原因です。データ本体を得るには、最初の行の先へ動かし、高さを 1 縮め ます — このクラスターの他の記事とまったく同じ Offset + Resize の組み合わせです。

Dim block As Range: Set block = ws.Range("A1").CurrentRegion
Dim body As Range
Set body = block.Offset(1, 0).Resize(block.Rows.Count - 1, block.Columns.Count)
' body は見出しを除いた状態。反復するか、配列として読む。

Offset(1, 0) は参照全体を 1 行下へスライドさせ、続いて Resize が高さを 1 詰めて、下端をはみ出さないようにします。これがこの クラスターの見返りです。CurrentRegion がブロックを検出し、OffsetResize が実際に 欲しい部分を切り出します。

CurrentRegion と UsedRange と End(xlUp)

3 つの道具が「データを見つける」と主張しており、選択を誤ると、大きすぎたり小さすぎたりする範囲の よくある原因になります。

  • CurrentRegion — セルを囲む連続ブロック。たいていはこれが欲しいものです。実際のデータの 島を追い、(空白の隙間がある限り)遠くの迷子は無視します。
  • UsedRange — Excel が触れられたと思っているすべて。書式だけ付いた空のセルや、リセット せずに値だけ消したセルも含みます。ふだんから過大に報告し、データよりはるかに大きい範囲を 返します(VBA UsedRange を参照)。
  • End(xlUp) / 最終行 — 単一の、つまり 1 つの列の一番下を見つけます。必要なのが行数 だけのときに使い(VBA Last Row を参照)、長方形全体を 1 回の呼び出しで 欲しいときは CurrentRegion を使います。

目安としては、ブロックをつかむには CurrentRegion、1 つの次元を測るには End(xlUp) に手を 伸ばし、データの範囲を知るのに UsedRange に頼るのは避けましょう — 編集のあとは嘘をつくから です。

ブロックの中のどのセルからでも、一度でつかむ

CurrentRegion は、左上だけでなく、島の中のどのセルからでも働きます — だからこそ ActiveCell.CurrentRegion は、ユーザーが立っている表が何であれ、それをつかみます。

Set block = ActiveCell.CurrentRegion        ' カーソルがある場所を囲む表

また、呼ぶたびに再評価されるので、.CurrentRegion を繰り返し呼ぶのではなく、一度保存して 変数を再利用しましょう。

Dim block As Range: Set block = ws.Range("A1").CurrentRegion
Debug.Print block.Rows.Count, block.Columns.Count   ' block を再利用し、再検出しない

つかんだあとにシートが変わったら、読み直しましょう — 変数は、呼んだ時点のブロックのスナップ ショットであって、独りでに広がる生きた参照ではありません。

信頼してよいとき — そしてテーブルを使うとき

CurrentRegion は「ここにある表に作用する」の正しい既定ですが、それはデータがきれいな端を 持つときだけです。内側に空白の行や列がなく、1 マス離れた迷子もない状態です。人のために作られた シート — 小計の隙間、セクション間の間隔用の行、見た目のための空白列 — では、静かに間違った 長方形を返します。レイアウトにそういうものがあるなら、空白セルの検出でごまかさず、データに 本物の形を与えましょう。ブロックを Excel のテーブルListObject)に変換します。その .DataBodyRange は、空白がたまたまどこに落ちるかではなく、構造で定義され、行が追加されると 自動で広がります。VBA Range と同じく、形はデータの中に宿るべきです — CurrentRegion はきれいなデータがすでに持つ形を読み、テーブルはそれを保証します。

ExcelMaster の活用

CurrentRegion は、便利な 1 回の呼び出しに、いくつもの静かな失敗を詰め込んでいます。ブロックを 半分に切る空白行、データに紛れ込む見出し行、範囲をふくらませる迷子の値、そして多すぎるか 少なすぎるかを決める、これと UsedRangeEnd(xlUp) の選択。どれもエラーを出しません — ただ 間違ったセルを処理するだけです。

ExcelMaster なら、代わりに 結果を説明するだけで済みます。「このシートのデータ表を、見出しなしで読んで」と言えば、ブロックを つかみ、それを切り詰めてしまう内側の空白がないか確認し、OffsetResize で見出しを落とし、 本体を返します — あるいは、レイアウトに CurrentRegion が耐えられない隙間があるときは、本物の テーブルを提案します。ブックもコードもあなたの手元に残り、行の半分が静かに消えた、あの実行を 飛ばせます。

よくある質問

Excel VBA の CurrentRegion とは何ですか?

CurrentRegion は、あるセルを囲むセルの連続ブロック — Excel が完全に空白の行と完全に空白の列に 出会うまで広げる長方形 — です。Range("A1").CurrentRegion は、見出しを含むそのブロック全体を 返します。表の中で Ctrl+Shift+* を押すことのコード版であり、最終行や最終列を計算せずにデータを 参照できます。

なぜ CurrentRegion は空白行で止まるのですか?

ブロックが空白で区切られるからです。完全に空白の行や列は壁として働くので、Excel はそこで 拡張を止め、隙間のあなた側の部分だけを返します — 静かに、エラーもなく。行の中のたった 1 つの空の セルはそれを壊しません。まるまる空白の行や列だけが壊します。CurrentRegion に表全体を つかませたいなら、内側の空白の行や列を取り除きましょう。

CurrentRegion と UsedRange の違いは何ですか?

CurrentRegion は特定のセルを囲む連続ブロックで、実際のデータを追います。UsedRange は、Excel がシート上で使われたと思っているすべて — 書式だけ付いた空のセルや、リセットせずに消したセルも 含みます — で、しばしば過大に報告し、データより大きい範囲を返します。本当のデータブロックを得る には CurrentRegion(またはテーブル)を使い、UsedRange は正確な範囲ではなく上限として扱い ましょう。

CurrentRegion から見出し行を除くには?

ブロックを 1 行下にオフセットし、高さを 1 縮めてリサイズします。 block.Offset(1, 0).Resize(block.Rows.Count - 1, block.Columns.Count) です。Offset(1, 0) は 参照を見出しの先へ動かし、Resize は最下行を詰めて、結果がデータの下へはみ出さないように します。ブロックが見出し行だけの場合はリサイズがゼロ行になるので、そのケースをガードしましょう。

表の中のどのセルからでも CurrentRegion を使えますか?

はい。CurrentRegion は左上だけでなく、連続ブロックの中のどのセルからでも働くので、 ActiveCell.CurrentRegion はカーソルのある表を返します。呼ぶたびに再評価されるので、 .CurrentRegion を繰り返し呼ぶのではなく、結果を変数に保存して再利用し、シートが変わったら 読み直しましょう。

検証環境

検証環境: Excel 365(Windows 11)、VBA 7.1 — 最終確認 2026-08-15。

関連ガイド: VBA Resize · VBA Offset · VBA Cells · VBA Used Range · VBA Last Row