【VBA】繰り返しはどれを選んだらいいの? For~NextとDo~Loopの違いと使用時のポイントを解説

ひとり働き方改革
記事内に商品プロモーションが含まれていることがあります。

For~Next、Do~Loop、どちらも繰り返し処理をするときに使用しますが、VBAを覚えたてだと、違いがよく分からず、この場合はどちらを使うの? になることありますよね。

この記事では For~NextとDo~Loop の違いを解説していきます。

また、実際に業務で使うために、ここも押さえておいた方がいいよ! なポイントもまとめました。

VBAでコードを書くときの基礎部分なので、あいまいかも? な人はぜひ読んでいってくださいね。

土台が固まれば、上に積み木が積めるはず!

この記事でわかることまとめ
  • For~Nextは回数が決まっているとき、Do~Loopは決まっていないときに使う
  • For~Next・Do~Loopを使うときのポイント

あれ? 繰り返しにはFor eachというのもあるらしいんだけど?

初心者はまず必要ないので、今回は説明しません!

繰り返し回数が決まっている場合はFor~Nextを使う

1行目から100行目を処理するなど、繰り返し回数(初期値と最終値)が決まっているときは For~Nextを使用します。

繰り返しで圧倒的に使うのがFor~Nextです。これで書けなかったら、Do~Loopかな? と思えば大丈夫です。

For~Nextの書き方は?

for カウント変数=初期値 to 最終値
 処理
next

カウント変数が初期値から最終値の間、処理を繰り返します。

カウント変数は、 カウント変数はi,j,kを使うという暗黙の了解があるので、特別な理由がなければiを使います。

最終値に最終行番号を入力する

全ての行に対して処理を行いたいけど、データを追加し続けるから、最終値(最終行の番号)が確定しない。そのようなときには、最終値を変数で設定しましょう。

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

特定の列で入力している一番下のセルの行番号を取得する

上記を図で説明すると以下の通りです。

Cells(Rows.Count, “A”).End(xlUp)の説明画像

指定した列のエクセルシートの一番下のセル( Cells(Rows.Count, 列) )から上に飛んだ( End(xlUp) )セルの行番号( .Row )を取得するので、A列に空白セルがあるかどうかにかかわらず、一番下に入力しているセルの値を取得します。

つまり、行数が未定の場合の繰り返し処理の書き方は次のようになります。

Dim last
last= Cells(Rows.Count, 列).End(xlUp).Row

for カウント変数=初期値 to last
 処理
next

カウント変数が「初期値」から「特定の列の最終行番号」の間、処理を繰り返します。

一度、最終行番号をlastなどの変数に代入するほうが、For~Nextの部分が読みやすくなります。

このFor~Nextの使い方は本当によく使うので、覚えておくことをおすすめします。

行の追加・削除をする場合は、下の行から上の行に向かって繰り返し処理を行う

繰り返し処理の中で、特定の条件のときに行を追加する・行を削除する場合は思った通りの動きをしないので注意が必要です。

例えば、次のようなシートがあって、備考(E列)に入力がある場合は、行を削除して、その他の場合はF列に「チェック済み」をVBAを使って入力したいとします。

VBA実行前のエクセルシート
VBA実行前のエクセルシート

理想の動きは次の通りだと思います。

2行目:F列に「チェック済み」を入力

3行目:削除

4~7行目:F列に「チェック済み」を入力

VBAのコード実行後の理想の結果
VBAのコード実行後の理想の結果

そのときに、次のようなコードを書くと、

Option Explicit

Sub 繰り返し()

    Dim i As Long
    
    For i = 2 To 7
        If Cells(i, "E") <> "" Then
            Cells(i, "A").EntireRow.Delete
        
        Else
            Cells(i, "F") = "チェック済み"
        
        End If
        
        
    Next

End Sub

結果は以下のようになってしまいます。

VBA実行後の実際の結果
VBA実行後の実際の結果

行を削除した後の行は、繰り返し処理開始前と行番号がずれてしまうため、未処理の行、処理しないはずだったのに処理している行が出てきてしまいます。

なので、行の追加・削除など、最初に設定した行番号が繰り返し処理の途中で変わってしまう場合は、上から下に順々に繰り返しを行ってはいけません。

行の削除・追加をしたいときは、初期値と最終値の値を逆にしましょう。

下から上へ順々に処理をしていけば未処理の行の行番号は、行の削除・追加しても変更になりませんので、理想通りの処理結果になります。

下記のように入力しましょう。

for カウント変数=初期値(1番下の行番号) to 最終値(1番上の行番号) step-1
 処理
next

カウント変数が初期値から最終値の間、処理を繰り返します。

stepで繰り返し時にカウント変数をいくつ増減するのかを設定します。(stepが省略してあるときは1)

この場合は、カウントは繰り返すたびに1ずつ減っていきます。

繰り返し回数が決まっていない場合はDo~Loopを使う

Do~Loopは一定の条件のもと繰り返しを行います。

Do~LoopでもFor~Nextとまったく同じ役割を果たせるため、For~Nextよりも Do~Loopの方が万能なのでは? と思われるかもしれません。

けれども、 Do~Loopは繰り返しから出られず、ずっと処理している状態(無限ループ)になる可能性があります。少しでもリスクを減らすため、 For~Nextで書けるものは For~Nextで書きましょう。

Do~Loopの書き方は?

Do While 条件
 処理
Loop

条件を満たす限り、処理を繰り返します。

処理の前に条件チェックを行います。そのため、1回も処理をしないことが有り得ます

※無限ループを防ぐため、必ず、繰り返しが終了する条件であること確認してください。

Do
 処理
Loop
While 条件

条件を満たす限り、処理を繰り返します。

処理の後に条件チェックを行います。そのため、必ず1回処理を行います

※無限ループを防ぐため、必ず、繰り返しが終了する条件であること確認してください。

条件の指定方法、whileの他にもuntilもあるよね……?

while(条件を満たす間)・until(条件を満たすまで)がありますが、条件式によって、同じことが表現できるので、覚えるのはいずれか一方で大丈夫です。

このWEBサイトではwhileでコードを書いていきます。

無限ループになってしまったときのために、必ず保存を行う

Do~Loopは繰り返しから抜けれず、永遠と処理中になってしまうことがあります。

強制的に処理を終わらせても、作業内容が消えないように、VBA実行前には必ず保存を行いましょう。

手動だとうっかり保存を忘れてしまうことがありますので、実行したいVBAの最初の方に以下のコードを追加して、自動で保存されるようにしておきましょう。

ThisWorkbook.Save

このExcelファイルを保存する。

まとめ

以下、この記事のまとめになります。

この記事のまとめ
  • できる限り、繰り返し処理はFor~Nextを使って書く
  • For~Nextの初期値・最終値は変数で設定することが可能
  • 行の追加・削除をするときは、step-1を利用する
  • Do~Loopを使用するときは、繰り返しから抜けるパターンが存在するか必ず確認する

繰り返しはプログラミングの基本。しっかりとマスターしてくださいね。

コメント

タイトルとURLをコピーしました