なぜ最終行を毎回探さないといけないのか

VBAでループ処理を書くとき、対象の行数を固定の数字で指定してしまうと、データが増減するたびにコードを書き直す必要が出てきます。

この記事では、最終行を自動で取得するCells(Rows.Count, 1).End(xlUp).Rowの仕組みと、注意しておきたい点を解説します。

行数を固定で書くと何が起きるか

For i = 2 To 100
Cells(i, 5).Value = Cells(i, 3).Value * Cells(i, 4).Value
Next i

このコードは、作成した時点でデータが100行程度であれば問題なく動きます。しかし、データが150行に増えた場合、101行目以降は計算の対象にならず、空欄のまま残ってしまいます。行数を固定した数字で書くと、そのときのデータ量にコードが縛られてしまうためです。

Cells(Rows.Count, 1).End(xlUp).Rowの仕組み

Rows.Countは、ワークシートの最終行番号(Excel 2007以降であれば1048576)を表します。そこから.End(xlUp)を使うことで、その位置からキーボードのCtrl+↑を押した状態を再現し、データが入っている一番下のセルまで自動的に移動します。

Dim ls_rw As Long
ls_rw = Cells(Rows.Count, 1).End(xlUp).Row

この一行で、A列に実際にデータが入っている最終行の番号を取得できます。ループの最後をこの変数に置き換えることで、データ量が変わっても対応できるコードになります。

For i = 2 To ls_rw
Cells(i, 5).Value = Cells(i, 3).Value * Cells(i, 4).Value
Next i

注意点:判定に使う列の選び方

Cells(Rows.Count, 1).End(xlUp)は、シートの一番下から上に向かって探すため、データの途中に空白行があっても影響を受けません。一番下から見て最初に見つかる、その列の本当の最終行を正しく取得できます。

注意が必要なのは、判定に使う列そのものです。もし判定に使った列だけ、一番最後のレコードで値が空欄になっていると(他の列には値が入っているのに)、そのレコードを飛ばして、実際より手前の行を最終行として誤判定してしまいます。日付やIDのように、レコードがある限り必ず値が入る列を判定に使うことが重要です。

なお、これはEnd(xlUp)特有の話であり、End(xlDown)を先頭行から使う場合は事情が異なります。先頭から下に向かって探すため、データの途中に空白行があると、そこで止まってしまい、実際より手前の行を最終行として取得してしまいます。

押さえておきたいこと

① Cells(Rows.Count, 1).End(xlUp).Rowで最終行を取得する

シートの最終行からCtrl+↑を再現し、データが入っている一番下のセルの行番号を取得します。この動きをイメージしておくと理解しやすくなります。

② 行数を固定の数字で書かない

For i = 2 To 100のように行数を固定してしまうと、データが増えたときに対応できません。最終行を変数として取得し、ループの終端に使うようにしてください。

③ 判定に使う列は、最後のレコードでも必ず値が入る列を選ぶ

判定に使った列だけ最後のレコードで空欄になっていると、そこを飛ばして手前の行を最終行と誤判定します。日付やIDなど、レコードがある限り必ず値が入る列を選んで判定してください。

まとめ

Cells(Rows.Count, 1).End(xlUp).Rowを使うことで、データ量が変わっても最終行を自動で取得できるようになり、行数を固定で書き直す必要がなくなります。体系的に学びたい方は、JIMOVEの動画講座もご活用ください。

よくある質問

Q. End(xlUp)以外に、最終行を取得する方法はありますか?

UsedRangeやCountAを使う方法もありますが、いずれも空白セルの扱いによって結果が変わる場合があります。判定に使う列を意識して選ぶという点は、どの方法でも共通して重要です。

Q. 判定に使う列の、最後のレコードだけ値が空欄になっていたらどうなりますか?

そのレコードを飛ばして、実際より手前の行を最終行として取得してしまいます。日付やIDのように、レコードがある限り必ず値が入る列を判定に使うことで回避できます。

Q. Rows.Countの数字は、常に同じですか?

Excel 2007以降のバージョンでは1048576行が最終行となっており、共通です。バージョンによる違いを気にせず使えます。そのため、1048576でも問題ありませんが、今はほとんどないと思いますが、Excel2003以前で動かすときは注意が必要です。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール