VBA 最終行まで繰り返し処理ををする方法

EXCELの処理をしていると、最終行まで繰り返し処理をしたいっということがよくあります。
また、EXCELの行は常に変動するので、固定で行数を決めても使えません。
そこで、よく使用する最終行まで繰り返す方法を紹介してます。

繰り返し処理(For文やDo文)のやり方がわからない方は、先にこちらの記事を参考にしてみてください。

「空白になるまで」処理を繰り返す

最終行まで処理を繰り返すということは、
言い換えると「空白になるまで」処理を繰り返すということになる場合があります。

このような表がある場合

合計金額を求めるマクロを作成してみましょう。

Do Untilを利用する方法

最もイメージしやすいのが、Do Untilを利用した方法でしょうか。
「Do Until ~」が ~になるまで処理を繰り返す。
という意味なので、Do Untilを利用してみましょう。

Private Sub cmdSum_Click()

    Dim row As Integer
    row = 2

    Do Until Cells(row, 1).Value = ""
        Cells(row, 5).Value = Cells(row, 3).Value * Cells(row, 4).Value
        row = row + 1
    Loop
    
End Sub

解説
3~4行目:行を宣言し、開始行を指定しています。
6行目:Cells(row,1).Valueが空白になるまで繰り返すという意味になります。
7行目:合計金額 = 値段 * 数量 の結果を代入しています。
8行目:行数を加算しています。これを忘れると無限ループが発生するので注意してください。

結果

空白になるまで合計金額が入力されていることを確認できました。

 

Do Whileを利用した方法

Do WhileはDo Untilの逆の意味なので、
「Do while ~」が ~の間処理を繰り返すという意味になります。

Private Sub cmdSum_Click()

    Dim row As Integer
    row = 2

    Do While Cells(row, 1).Value <> ""
        Cells(row, 5).Value = Cells(row, 3).Value * Cells(row, 4).Value
        row = row + 1
    Loop
    
End Sub

解説

6行目:空白ではない間、繰り返し処理を行う。

先ほどの「Do Unitl」と同じ結果を得ることができました。

For文を利用した方法

続いて、For文を利用した方法を紹介します。
For文を利用するには、最終行の行数を知る必要があります。
最終行を取得するには、

セル.End(xlDown).row

を利用しましょう。指定したセルから「Ctrl + ↓」を押したときのセルの行数を取得できます。

For文の例を見ていきましょう。

Private Sub cmdSum_Click()

    'For文 End(xlDown)
    For i = 2 To Cells(2, 1).End(xlDown).row
        Cells(i, 5).Value = Cells(i, 3).Value * Cells(i, 4).Value
    Next
    
End Sub

解説

4行目: 2行目から空白になるまで(8行目まで)ループするという意味になります。
この例では「Cells(2, 1).End(xlDown).row」は8が取得されます。
「For i = 2 to 8」 と同じ意味になります。

結果

For文で合計金額を取得することができています。

「最終行まで」処理を繰り返す 空白は無視

最後に、空白を無視して「最終行まで」ループする方法を紹介します。
For文を利用した方法を紹介してきます。
先ほどは指定した行から「ctrl + ↓」の行を取得してループさせていましたが、
下記画像のような場合は、うまく計算させることができません。
9行目が空白になっているからです。

結果

このような場合は、エクセルの最終行から「ctrl + ↑」の行数を取得し
ループさせることで空白を無視することができます。
エクセルの最終行は、「Rows.Count」を利用しましょう。
また「ctrl + ↑」は 「最終セル.End(xlUp).row」で取得することができます。

例を見てみましょう。

Private Sub cmdSum_Click()

    'For文 End(xlUp)
    For i = 2 To Cells(Rows.Count, 1).End(xlUp).row
        Cells(i, 5).Value = Cells(i, 3).Value * Cells(i, 4).Value
    Next
    
End Sub

解説

4行目:「Cells(Rows.Count, 1).End(xlUp).row」で最終セルから「ctrl + ↑」をしたセルの行数を取得することができます。
今回の例では10が取得できるので「for i = 2 to 10」と同様の処理になります。

結果

空白行の後の行も計算されていることが確認できました。
このように、空白までではなく本当に最終行まで計算させたい時は、
この方法を利用しましょう。

まとめ

「空白になるまで」繰り返し処理を行う場合と「最終行まで」繰り返し処理を行いたいのか、
しっかりと理解してから使いましょう。

Do Until や Do While や For など色々紹介していますが、
自分が使用しやすいやり方を1つ覚えておくといいと思います。

 

EXCEL VBAの記事一覧

おすすめの記事