タケモ塾

VBAで最終データ行を求める2つの方法(有効データ範囲が重要)

こんにちは。Excel開発15年、セルネッツの竹本です。
今回は最終行の求め方について解説をします。

セルネッツ:VBAで最終データ行を求める2つの方法

Excelの基本は行と列!

まず最終行の求め方の前にExcelの基本の考え方なんですが、Excelはワークシートになるので行と列という概念しかありません。

セルネッツ:VBAで最終データ行を求める2つの方法

行とは縦方向のことです。行の高さが高い低いというような呼び方をします。

列は横方向に対するものなので、列の幅が狭い広いというような使い方になると思います。

ここで重要なのは、何行目何列目とセルの番地をひとつだけ特定できることが表計算ソフトの特徴ということです。これがExcelの基本と考えてください。

セルネッツ:VBAで最終データ行を求める2つの方法

有効範囲データが重要な件(始点と終点)

続いて有効範囲データが重要な件ですが、こちらの絵に描かれているような一覧表のようなものがあった場合、始店と終点という考え方をします。

セルネッツ:VBAで最終データ行を求める2つの方法

この始点がどこから始まって、どこで終わるのか、左上と右下の範囲を有効データ範囲という呼び方をしますが、とても重要です。

始点という考え方も終点という考え方も、先ほどのお話したセルズ(行間、列)ということで、行がはじめに来ます、そしてカンマが来ます、そして列です。

セルズの右カッコ内はカンマの左側が行で右側が列です。これも覚えてください。

最終行の求め方「2つの方法」

最終行の求め方ですが、今回は2つの方法を紹介します。

セルネッツ:VBAで最終データ行を求める2つの方法

「2つの求め方」実演デモ(1つ目【A】の方法)

まずAですが、特定の列の一番下から上方向にカーソルを飛ばして、データが存在した場所、検出した場所を最終行とみなすやり方です。

Bは隣接するデータ範囲から最終行を求めるやり方です。実際にデモをしていきます。

たとえばこんな10行のデータがあったとします。

セルネッツ:VBAで最終データ行を求める2つの方法

まずAの求め方です。最終データ行は11行目になればOKですよね。

有効データ範囲、最終行が11行目、最終列が5列目ということで、正しく取れています。

セルネッツ:VBAで最終データ行を求める2つの方法

ところがA列に欠落があった場合はどうなるか、10、9という数字が欠落していた場合は最終行が9行、最終列が5行という判断をしてしまいます。

これはCtrlキーと上矢印キーを押したときの求め方なので、Ctrlと下矢印キーを押してみます。すると一番下に行きます。

セルネッツ:VBAで最終データ行を求める2つの方法

Ctrlを押しながら上矢印キーを押したときに9行目でカーソルが止まったので、データは9行目が最終行とみなしました。これが有効データ範囲という考え方になってしまいます。

今の求め方はここ(№)が全部なくても下から求めているだけなので9行目となります。ここが歯抜けになっていても同じですよね。

下方向から上方向にジャンプをしてデータが提示された行になります。

というふうに求めますが、たとえばフィルターがかかっていた場合、下のほうが白が3つ続いていますが、オレンジというフィルターをかけていた場合に同じことをやると、今度は最終行が8行目になってしまいました。

セルネッツ:VBAで最終データ行を求める2つの方法

ということで、8行目以降の3つがこうなってくると置いてけぼりになってしまいます。

セルネッツ:VBAで最終データ行を求める2つの方法

有効データ範囲をこれとみなして処理が進んで、今のようなフィルターがかかっていると置いてけぼりになってしまいます。

シートの非表示の場合もそうです。ここを非表示にしています。

このケースでも有効データ範囲、9行目となってしまっていますので、このあたりに非常に注意をする必要があります。

セルネッツ:VBAで最終データ行を求める2つの方法

「2つの求め方」実演デモ(2つ目【B】の方法)

一方でもうひとつのBの求め方をやってみます。

セルネッツ:VBAで最終データ行を求める2つの方法

Bの求め方はカレントレジオンという呼び方をしますが、現在のデータの選択範囲から求めるやり方です。隣接するデータ範囲から求める方法です。

Bでやった場合、この3つがなかったとしても正しく11行目という最終行が求まります。

セルネッツ:VBAで最終データ行を求める2つの方法

これはA1を起点として[Ctrl]+[Shift]+[*(アスタリスク)]。

A1から連続した隣接したデータ範囲の行数と列数が求まるので、フィルターがかかっていたとしても正しく行番号・列番号が取得できます。

大きくこの2つの方法を使い分けて最終データ行を求めることになります。

【A】詳細解説(Rows.Count Colums.Count)

もう少し詳しくお話をすると、Aの求め方はカーソル起点位置から指定方向に向かって値が検出されたセル番地になります。

セルネッツ:VBAで最終データ行を求める2つの方法

なのでこの4種類、Ctrlを押しながら、上下左右方向で求めることができます。一番多く使うのはこれとこれです。

セルネッツ:VBAで最終データ行を求める2つの方法

上から下方向、左から右方向に検索することはまずないので、この方法によって求めた値が最終行とみなすということです。

ここで覚えてほしいのはローズカウント、カラムズカウントということですが、シートの最終データ行数を調べるのはローズカウント、列数はカラムズカウントになります。

R1C1参照形式を使用する、とは?

たとえばここでホームで数式にして、R1C1参照形式を使用します。

セルネッツ:VBAで最終データ行を求める2つの方法

するとExcelの列の表記が数値に変わります。

ここから先ほどのCtrl、右矢印で右方向に行ってみます。

セルネッツ:VBAで最終データ行を求める2つの方法

すると1万6384列目、これがExcelの最終列です。

そしてCtrlを押しながら下矢印を押すと104万8576行目、これがExcelのワークシートの最終行です。

ここから左に飛んで、先頭から上に飛ぶと、1列目にはなにもなかったので1行目でカーソルが止まっています。

やっていることは最終データ行数を求めて、そこから特定方向にジャンプして求めていきます。

Rows.Count Colums.Count 構文解説

これは構文ですが、この方法で最終行を取得しています。

セルネッツ:VBAで最終データ行を求める2つの方法

このローズカウントが先ほどの最終データ行数を取得しているものなので、セルの右側のカッコの中、カンマの左側が行、カンマの右側が列です。

ということは、最終行100何万行目の一番下の1列目にカーソルを置いたところから上方向にアップになっているので、ジャンプして取ってくるということをしています。このまま覚えてください。このまま使ってくださいという感じです。

列についても考え方は同じです。

セルネッツ:VBAで最終データ行を求める2つの方法

セルズのカッコのカンマの左側は行番号です。行、カンマ、列なので、右側のカラムズカウントがここでしたよね。

最終データ列数、一番右側を確認しましたが、そこにカーソルを置いて、今度はExcel to leftなので、左方向に飛ばしたときの列数・列番号を取得します。行と列の求め方はこれが一般的なやり方になります。

R1C1参照形式解説

先ほどのR1C1参照形式ですが、今表示されているこれ、Rは行、rowのRです。Cはカラムの列のCです。

セルネッツ:VBAで最終データ行を求める2つの方法

ここでR12、C15となっているのが12行目の15列目、今ここにカーソルを置いています。アルファベット形式ではなく数値になっている、R1C1形式になっているだけなので、これはそういうものだと覚えてください。

ここで混乱することが多いのですが、シンプルに考えてください。

【B】詳細解説(CurrentRegion、Ctrl+Shift+*)

Bの求め方については、やっていることがこれです。

セルネッツ:VBAで最終データ行を求める2つの方法

先ほどの求め方とは違って、CtrlとShift、アスタリスクを押したときに選択された範囲からデータの行数列数を求めます。

たとえばカーソルをここに置いた状態でCtrl、Shift、アスタリスクを置くと、この状態です。

CurrentRegion Ctrl+Shift+* 構文解説

この状態からセルの行数・列数を求めるのがこの構文です。

セルネッツ:VBAで最終データ行を求める2つの方法

この例ではA1にカーソルを置いて、その選択された範囲の中からrow、行と列を求めるというやり方になるので、このやり方をすれば先ほどのオートフィルターがかかった状態だったりしても、データが連続して隣接している状態であれば正しくなってくることができます。

この2つの方法を覚えてください。

最終行の求め方「2つの方法」まとめ解説

求め方に関する説明だったのですが、2つの求め方は考え方が全然違います。

セルネッツ:VBAで最終データ行を求める2つの方法

下が行数を求める、上は行番号を求めるということで考え方が違います。

両者の留意点ということで、結局どちらを使って取得すれば良いのか、答えはケースバイケースです。なぜならどちらにも長所短所があるからですが、基本はAだと思っています。

Aで求めるケースでは、フィルターがかかっている、絞り込みをされている状態が考えられるので、いったん解除してからなど、行が非表示にされている可能性があるので、このあたりを解除してから求めないといけません。

一方でBは、行番号を求めているわけではなく、データの行数と列数を求めているので、Aのような解除する必要はありませんが、何行目から何列目までが有効データ範囲なのか、場所によっては正しく取れないので、どちらを使えば良いのかというのが仕様によるということになってしまいます。

本日の解説まとめ

最後、まとめです。

セルネッツ:VBAで最終データ行を求める2つの方法

1番、考え方は列も同じ。行番号の取得、最終行の取得というお話をしましたが、列に関しても、何行目を右から左に行ってデータが存在したところを最終列を考えるかどうかということなので、行と列は考え方としては一緒になります。

2番目、仕様を明確に定めることが一番重要だと思っています。

もちろん最終行を誤ったりした場合は得られる結果が変わってしまうので、不具合・バグというような結果をもたらすことにつながってしまうので、どういう方法で有効データ範囲を求めるのか、有効データ範囲の定義を明確にする必要があります。

3番目、話してしまいましたが、有効データ範囲の定義を求める。

左上の赤い始点から右下の赤い始点のところまで、これがどこの位置になってくるのかということです。

緑色の枠がワークシートだとすると、通常というか、データベースであれば必ずこういう形になりますが、1行目が見出し、2行目以降が明細データ行となり、Excelの場合は運用上、余白を開けたり、よくリストの選択肢など、こういう使い方をされているケースもあったりするします。

開発の場合はすべて横一列に、横方向に直していく必要がありますが、システム開発的には困ったことが起きます。

ということで、左上の始点から右下の終点まで、どの範囲を有効データ範囲として定めていくのかが重要になります。

これに関してはのちにバグという不具合が報告された際にバグ認定するかしないかにも関わってきます。なので、仕様を明確に定めるところに注力をしてください。

解説は以上となります。少しでも参考になったかたはぜひチャンネル登録・高評価をお願いします。毎週金曜日の夜9時に投稿しています。ありがとうございました。

タケモ塾では、今後も皆さんのVBA学習に役立つコンテンツを作成してまいります。
ブログ記事、Youtubeチャンネルのご質問・ご感想・ご要望などお気軽にお問合せください。
お問合せはこちらから
                         タケモ塾運営:株式会社セルネッツ