TL;DR —
CurrentRegionは、あるセルを囲むセルの連続ブロックです。Excel はあなたの セルから始めて外へ広がり、完全に空白の行と完全に空白の列にぶつかるまで拡張して、その 途切れない島を囲む最小の長方形を返します —Ctrl+Shift+*で選択されるものと同じです。端は 計算しません。Excel が見つけます。罠は、たった 1 本の完全に空白の行または列が壁となって ブロックを静かに分断することで、エラーもなくデータの半分だけが返ってくることがあります。 見出し行も含まれるので、OffsetとResizeで 落としましょう。
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が見出しを含む理由と、その落とし方UsedRangeやEnd(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 がブロックを検出し、Offset と Resize が実際に
欲しい部分を切り出します。
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 回の呼び出しに、いくつもの静かな失敗を詰め込んでいます。ブロックを
半分に切る空白行、データに紛れ込む見出し行、範囲をふくらませる迷子の値、そして多すぎるか
少なすぎるかを決める、これと UsedRange と End(xlUp) の選択。どれもエラーを出しません — ただ
間違ったセルを処理するだけです。
ExcelMaster なら、代わりに
結果を説明するだけで済みます。「このシートのデータ表を、見出しなしで読んで」と言えば、ブロックを
つかみ、それを切り詰めてしまう内側の空白がないか確認し、Offset と Resize で見出しを落とし、
本体を返します — あるいは、レイアウトに 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
