表の最終行を取得する
変数に慣れてきましたでしょうか?
変数という箱に何かの数値や文字列を入れることができると分かったので、今回は表の最終行を取得するということに挑戦します。
というのは、For Nextで繰り返し作業を仕込む時にこれまでは、
2 to 4 のように、最終行を具体的な数字で書き込んでいました。
短い表だったら見ればわかるのでいいんですが、顧客リストなどではとても長い行になる場合があります。
また、途中で行を挿入したりすると、最終行の数が変わっちゃうことになっていちいちマクロを打ち直すのが面倒です。
ということで、表の最後の行がわかると(取得できると)便利なので、今回はそれをやってみましょう。
例えばこういうリストがあったとします。
このように、A1にカーソルがある場合、Ctrl+↓ を押すと、A6まで飛んでくれます。
A1はCells(1, 1)なので、これをマクロで表現するには、
Sub saishugyo()
Cells(1, 1).End(xlDown).Select
End Sub
と書きます。
これを実行すると、確かにA列の最後の行であるA6を選択してくれます。
しかしこれだと、たまたま空行がリストにあった場合、そこに飛んでしまうので、本当の最後の行まで行くことができません。
ということで、まずはエクセルの最後の行まで飛びます。
マクロで書くと、
Cells(Rows.Count, 1).Select
この Rows.Countというのは、「このシートの全ての行の数」という意味です。
つまりこれを実行すると、A列の最後の行(僕の環境では 1048576行)に飛びます。
本当の最後の行まで行けたので、Ctrl+↑で、リストの最後の行に飛びましょう。
マクロで表現すると、End(xlUp)を追加して
Cells(Rows.Count, 1).End(xlUp).Select
と書いてください。
本当の最終行から、Ctrl+↑で戻って、選択。
ってことですね。
ということで、狙い通り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に「6」と入れることができました!
ということは、B列の最終行を取得すると、きっと「3」になるはず・・・。
Cells(1, 5) = Cells(Rows.Count, 2).End(xlUp).Row
と、変更してみましょう。
これを実行すると
ちゃんと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で説明していますので、ご参照ください。
最終行を、一旦変数lastRowに入れましょう。
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
次に、D2にオーブ(1972)となるようにしましょう。
D2はCells(2, 4)。文字列の結合を使って
Cells(2, 4) = Cells(2, 1) + Cells(2, 3)
と、してみましょう。
ですが、これを実行するとエラーが出てしまいます。
これは、「オーブ」は文字列という型、「1972」は数値という型だから『いやいや型が違うものは足せませんよ』ということのようです。
今やりたいことは文字列の結合なので、「1972」の型を文字列に変更しましょう。
数値を文字列に変換するにはStr関数を使います。
Cells(2, 4) = Cells(2, 1) + Str(Cells(2, 3))
これでエラーが出ずに文字列を結合することができました。
あとは、前後に()を付けてFor Nextで繰り返します。
Sub hw13_lastRow()
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To lastRow
Cells(i, 4) = Cells(i, 1) + "(" + Str(Cells(i, 3)) + ")"
Next
End Sub
これでうまく行きました。
エクセルマクロ(EXCEL VBA) その14 シートの複製(Sheets Copy)
(文:森脇孝/エントレ)