VBAと日々のこぼれ話

  1. VBA

Excelシートの最終行を取得したい その1

最終行の取得コードについて

Excelシートの最終行数(列数)を求めるためのコードは利用頻度が高いため多くの人が考え、結果、洗練されており以下で示すサンプルコードの一択だと思っています。
ですので、私はサンプルをコピペして使っている方々にこのコードの構成+念のためのチェック(サンプルコード内の空列チェック)を紹介できればと思います。

【スポンサーリンク】



サンプルコード

 

そもそもこのコードは、いくつもの前提とみなしがあって「最終行の取得」を成立させています。

検索対象にした列は、データレコードであれば途中抜けもなく必ず入力されている「はず」なので、
指定した列の最終行のセルから「Cntl + ↑」を実行してカーソルがこれ以上進めない行の行数を最終行と「みなす」。
カーソルが進めないのは、セルに何らかの値(「壁」)が設定されている「はず」

おおよその場合は、この方法で最終行は取得可能です。

ですが、これで正確に取得できるかと言うとそういう訳でもないのが実情です。

先ほどの一つ目の「はず」である途中の抜け(検索対象列の途中に空白がある場合)は問題点として取り上げられることも多いです。

またフィルタでの絞り込みに関しても最終行を求める際の弊害になるので一度解除が必要です。
※最も途中の抜けは、最終行を求める前にどういう扱いにするのか対応しておくべき問題だと思いますが。

そして今回一番伝えたいことです。
あまり言及されているものを見かけませんが、「Cntl + ↑」を実行してカーソルが進めなくなる「壁」は、何もセルの値だけではありません。

実は「Cntl + ↑」を実行してカーソルが進めなくなるのには、2種類あって

①セルに何か値が設定されている場合
②シート範囲を超えてしまう場合

①は通常考えられる「壁」なので割愛しますが、厄介なのは②です。

【スポンサーリンク】



越えられない壁とは

パターン1.A1のみに値が入っているシート

パターン2.A列全てのセルに値が入っていないシート

上記の2パターンに対して、それぞれサンプルコードを実行すると(空列チェックを除く)実はどちらも最終行は「1」なのです。

パターン1の最終行が1なのは分かり切ったことなのですが、パターン2は本来「Cntl + ↑」シート範囲外まで進むことになります。

ですが、シート外へはどうやっても越えられません。
だから仕方なく「1」が返ってくるのです。

でも、これって本来求めたいものではありませんよね。
最終行が本当に1行目なのかそれとも仕方なしに1行目となっているのか。

それを判定しているのが、サンプルコード上の「空列チェック」で、当該列のセルが全て空だったら最終行「0」を返すようにしています。
ちなみにですが、判定時にTrimを付けていますがセルの値がスペースのみでもデータ設定ありとみなすなら不要ですよ。

余談ですが「②シート範囲を超えてしまう」が発生するのは、ヘッダ(各項目の見出し行)がないデータなのでレアと言われればレアです。
が、なるべく数多くのパターンに対応してあげた方が親切な作りかなと思います。

 

VBAの最近記事

  1. 【VBA】QRコードを作成したい

  2. 【VBA】CSVを1行ずつ処理したい

  3. Excelシートの最終行を取得したい その1

  4. 【VBA】未だに苦手としていること

  5. 【VBA】モジュール先頭に記述する4種類のOption キーワード ステートメント

関連記事

【スポンサーリンク】




PAGE TOP