エクセルマクロ(EXCEL VBA)

エクセルマクロ(EXCEL VBA) その13 最終行を取得する

表の最終行を取得する

変数に慣れてきましたでしょうか?

変数という箱に何かの数値や文字列を入れることができると分かったので、今回は表の最終行を取得するということに挑戦します。

というのは、For Nextで繰り返し作業を仕込む時にこれまでは、
2 to 4 のように、最終行を具体的な数字で書き込んでいました。

短い表だったら見ればわかるのでいいんですが、顧客リストなどではとても長い行になる場合があります。
また、途中で行を挿入したりすると、最終行の数が変わっちゃうことになっていちいちマクロを打ち直すのが面倒です。

ということで、表の最後の行がわかると(取得できると)便利なので、今回はそれをやってみましょう。

 
例えばこういうリストがあったとします。

このように、A1にカーソルがある場合、Ctrl+↓ を押すと、A6まで飛んでくれます。
A1はCells(1, 1)なので、これをマクロで表現するには、

Sub saishugyo()
Cells(1, 1).End(xlDown).Select
End Sub

と書きます。

Ctrl+↓の書き方

これを実行すると、確かにA列の最後の行であるA6を選択してくれます。
しかしこれだと、たまたま空行がリストにあった場合、そこに飛んでしまうので、本当の最後の行まで行くことができません。

 
ということで、まずはエクセルの最後の行まで飛びます。
マクロで書くと、

Cells(Rows.Count, 1).Select

この Rows.Countというのは、「このシートの全ての行の数」という意味です。
つまりこれを実行すると、A列の最後の行(僕の環境では 1048576行)に飛びます。

本当の最後の行まで行けたので、Ctrl+↑で、リストの最後の行に飛びましょう。
マクロで表現すると、End(xlUp)を追加して

Cells(Rows.Count, 1).End(xlUp).Select

と書いてください。

解説

本当の最終行から、Ctrl+↑で戻って、選択。

ってことですね。

A6が選択できた

 
ということで、狙い通りA6が選択できたのですが、最終行の行番号である「6」を取得するにはどうしたらいいでしょう。

今は、.Selectで選択してたわけですが、ここを.Row に書き直してください。

Cells(Rows.Count, 1).End(xlUp).Row

これで行番号が取得できたはずです。
でも、これで実行するとエラーが出ちゃいますので、この取得した数をE1に入れてみましょう。
E1は、Cells(1, 5)ですので、

Cells(1, 5) = Cells(Rows.Count, 1).End(xlUp).Row

としてみましょう。

E1にA列の最終行数を入れる

これを実行すると

E1に6と入った

無事にE1に「6」と入れることができました!

ということは、B列の最終行を取得すると、きっと「3」になるはず・・・。

Cells(1, 5) = Cells(Rows.Count, 2).End(xlUp).Row

と、変更してみましょう。

B列に変更

これを実行すると

B列の最終行が取得できた

ちゃんと3になって、B列の最終行がうまく取得できていることがわかりました。

ちょっと長いんですが、

Cells(Rows.Count, 1).End(xlUp).Row

これで、「A列の最終行が取得できる」と覚えておいてください。

この「Cells(Rows.Count, 1).End(xlUp).Row」は、For Nextの中でそのまま使うことができます。
例えば、2行目から最終行までと設定したい場合は、

For 2 To Cells(Rows.Count, 1).End(xlUp).Row

と書けばよいということです。

例えば、この「A列の最終行を取得できるコード」を、変数 lastRow に入れておくと、

lastRow = Cells(Rows.Count, 1).End(xlUp).Row

この後のコードには、lastRow と書くだけでいいので便利です。

宿題-13

同じ表で、D列に、
オーブ(1972)
帝国劇場(1897)

となるように、For Nextを使って表現してください。
文字列の結合は、その6で説明していますので、ご参照ください。

エクセルマクロ(EXCEL VBA) その14 シートの複製(Sheets Copy)

(文:森脇孝/エントレ)

関連記事一覧