エクセルのVBAでプログラムをしていると、対象シートの最終行と最終列を取得したい、
ということが頻繁にあります。
最終行、最終列がわからなければ、どこまで処理してわからないからです。
例えば、売上台帳で1行ごとに利益の計算をしていくプログラムがあったとします。
下の表のような感じでエクセルシートに売上を入力し、プログラムで利益を計算します。
1行目 | 商品名 | 売上 | 原価 | 利益 |
2行目 | すいか | \2000 | \900 | |
3行目 | メロン | \4500 | \2000 | |
4行目 | グレープフルーツ | \500 | \200 | |
5行目 |
2行目からプログラムを始めればよいというのはすぐわかるのですが、問題はどこで終わらせればいいのかということですね。
この表の場合、4行目まで入力されているので、4行目までと決めて処理することもできます。
For y= 2 to 4
cell(y,5) = cell(y,3) – cell(y,4)
next y
こんな感じで。でもこれだと、5行目まで入力された場合、5行目の処理ができません。プログラムとしては使い物にならないですよね。
じゃあ適当に多めの行を取っておくという手もあります。
For y= 2 to 10000
cell(y,5) = cell(y,3) – cell(y,4)
next y
こんな感じで10000行目まで処理するようにしておけば、その行になるまでは大丈夫なわけです。
でも10000行入力されていないのに無駄な処理をすることになるし、なんかスマートじゃないですよね。
そこで最終行を取るメソッドが有効になります。
endY = .Rows(.Rows.Count).Row
endX = .Columns(.Columns.Count).Column
End With
変数endYに最終行、変数endXに最終列が入ります。
これをプログラムの処理の先頭に入れておけば、無駄な処理をしなくて済みます。
With ThisWorkbook.Sheets(“シート名”).UsedRange
endY = .Rows(.Rows.Count).Row
endX = .Columns(.Columns.Count).Column
End With
For y= 2 to endY
cell(y,5) = cell(y,3) – cell(y,4)
next y
ただしこの方法はセルにデータが入っていなくても、罫線や塗などの書式設定や数式が入っていると、それも最終行とみなします。
データが入っている行だけ処理したい場合は、別の処理を加える必要があります。
まあ、とにかく手軽に最終行、最終列を取得したい、そんなときに使ってみてください。
最後までご覧いただきありがとうございます。