VBAでは一番上の行から順に処理をしていくという状況が非常に多いと思います。1行にかかる時間はコンマ何秒と早くても100万桁を超えるエクセルの行数を処理していけば膨大な時間がかかってしまいます。そのため「1行目から20行目まで」のように行数を指定することもできますが、行数が超える状況になるといちいちコードを修正する必要があります。
そのほかにも様々な理由がありますが、実際に存在する行をすべて処理をして、そこで処理を終わらせることができれば効率も良く、エラーの起きにくいコードを作ることができます。
そこでデータの最後の行を探す方法を何点かご紹介いたします。
VBAで最終行の行数を取得する場合
まず、最終行に直接移動するのではなく、最後の行が何行目なのかを取得したいとします。
その場合はまず下のように記述します。
Dim Last_Row As Long
Last_Row = ActiveSheet.Cells(Rows.Count, 2).End(xlUp).Row
MsgBox "最終行は" & vbCrLf & Last_Row & "行目です。"
このコードを実行すると
と表示されます。
あとはこの「Last_Row」の変数を使って処理をしてください。
VBAで先頭行から最終行までを範囲指定する場合
先頭行から順に別のシートや別のブックにデータをコピーしたい場合などは1行目から順にデータをコピーしていくという方法もありますが、行数が増えてくると結構時間がかかってしまいます。
そのような場合はデータ全体を選択してコピー&ペーストすることで一つの動作で終わらせることができます。その場合のデータの1行目からデータの最後までを選択する方法を一つ紹介します。
データの最初のセルがB3と分かっている場合は
Dim Last_Row As Long
Last_Row = Cells(Rows.Count, 2).End(xlUp).Row
Range(Cells(3, 2), Cells(Last_Row, 6)).Select
このようにデータ範囲をすべて選択した状態にすることができました。
VBAで上から順に処理をしながら探す場合
上から順に処理をしていき特定の列の値が○○になったら処理を終えるとすることもできます。
Dim i As Long '変数にiを宣言する
i = 3 'iに3を代入する
Do
Cells(i, 2).Interior.ColorIndex = 6 'i行目のB列を黄色に網掛けする
i = i + 1 'iに1を足して一行下に下げる
Loop Until Cells(i, 2).Value = "" 'i行目のB列が空欄だったら処理を終了させる
しかしこの場合、途中のデータがデリートで消されていたり、入力されていないデータがあったりするとそこで処理が止まってしまい、最後まで処理がされません。
そこでエラーになってくれればまだいいですが、エラーにならずそこから下のデータを完全に無視されると気が付きにくく、仕事のミスや漏れにつながってしまいます。
そのためReBizRUでは上から探すのではなく下から探す方法をお勧めしています。
具体的な方法を以下にご紹介いたします。
VBAで最終行のセルを選択した状態にする場合
最終行のB列を選択したいとします。その場合はまず下のように記述します。
Cells(ActiveSheet.Cells(Rows.Count, 2).End(xlUp).Row, 2).Select
このコードを実行すると
となります。B14のセルが選択された状態にできました。
さらに最終行の次の行にデータを入力していきたい場合はここからさらに一行下を選択する必要があります。この後1行下に下がるという処理をしてもいいですが、それなら初めから
Cells(ActiveSheet.Cells(Rows.Count, 2).End(xlUp).Row + 1, 2).Select
とすることで
となり、B15のセルを選択することができました。
コメント