【Excel VBA入門】Do While ~ Loop文の使い方。条件付きループを学ぶ
こんにちは、業務自動化ツール開発担当の吉池(@valmore_myoshi)です。
今回は、VBAにおける繰り返し処理の一つ、Do ~ Loop文を解説します。前回はFor文を取り上げましたが、特定の条件を満たすときに処理を実行し続けるならDo ~ Loop文が適しています。
本記事では、そんなDo ~ Loop文の基本はもちろん、For文との使い分けまで解説します。ループ処理の扱い方を学んでVBAをより使いこなす一助になれば幸いです。
目次
Do While ~ Loopとは
Do While ~ Loop文とは、条件を満たしていれば繰り返し処理を実行する制御構文です。Do Whileのあとに条件式を記述します。
Do While 条件式 繰り返し処理 Loop
例えば、ループ処理のたびに1ずつ加算し、5以上になるまで繰り返すプログラムを考えると、下記のように書けます。
Dim i As Integer i = 1 Do While i < 5 Debug.Print i & "回目の処理です。" i = i + 1 Loop
ループを途中で飛ばす、抜けたいとき
Do While ~ Loopの繰り返し途中でループを飛ばしたいときは一工夫必要です。ほかのプログラミング言語を学んだことがある方はContinueを使えばいいのでは?と思うかもしれませんが、VBAにContinueはありません。
そのため、If文を使って処理を飛ばす処理を書きましょう。下記の例ではカウント数が3のときに処理を飛ばしています。
Dim i As Integer i = 1 Do While i < 5 ‘ カウント数が3でなければ処理する、つまり3のときは処理しない If i <> 3 Then Debug.Print i & "回目の処理です。" End If i = i + 1 Loop
また、ループを抜けたいときはExit Doを使います。下記の例はループ処理のたびに変数に1を加算し、3になったときにループを抜けるよう処理しています。
Dim i As Integer i = 1 Do While i < 5 Debug.Print i & "回目の処理です。" If i = 3 Then Exit Do End If i = i + 1 Loop
Do While ~ Loop文とFor文の使い分け
繰り返し処理の基本であるFor文では、ループ回数を指定したり、For Each文で配列やコレクションの要素数分のみループ処理できました。一方、Do While ~ Loop文であれば回数がわからなくても柔軟に対応できます。
例えば、ループ回数を指定せずとも、セルに値が入っている間は処理を行う、ということがDo While ~ Loop文ではできるのです。下記の例は、指定した列のセルに値が入っている間、となりのセルにカウントした数を入れるプログラムです。
Dim i As Integer i = 1 ‘ セルに値が入っていれば繰り返し実行! Do While ActiveCell.Value <> "" ActiveCell.Next.Value = i ‘ 一つ下のセルを選択 ActiveCell.Offset(1).Select i = i + 1 Loop
つまり、回数を明示的に指定したい、あるいは配列やコレクションの全要素を対象にループ処理するときはFor文がオススメ!逆に回数がわからなかったり、回数に依存しない条件に応じてループさせたいときはDo While ~ Loop文が適しています。
For文について詳しく知りたい方は下記の記事をご覧ください。
【Excel VBA入門】For文の使い方。繰り返し処理の基本を学ぶ
条件式を満たさないときにループさせるにはUntil
Whileの代わりにUntilを使えば条件を満たさなければループを続行する処理を書けます。
Do Until 条件式 繰り返し処理 Loop
先ほどの例題である、セルの値が入っていればとなりのセルにカウント数を代入するプログラムをUntilで書き直してみましょう。Whileでは「セルの値が空でない」が条件でしたが、Untilでは「セルの値が空である」を条件にすると同じ意味合いになります。
Dim i As Integer i = 1 Do Until ActiveCell.Value = "" ActiveCell.Next.Value = i ActiveCell.Offset(1).Select i = i + 1 Loop
最低1回ループを回すにはDo ~ Loop While
これまでのDo While ~ Loop文では最初に条件式を判定するため、条件を満たさなければ一度もループ処理をせずに終了するケースもあります。
しかし、最初の1回は必ず処理させたいときもあるはずです。そんなときは最初にWhileを付けるのではなく、Loopの後にもっていきます。Whileの代わりにUntilも同様に使えます。
Do 繰り返し処理 Loop While 条件式 ‘ Untilを使う場合 Do 繰り返し処理 Loop Until 条件式
例えば、1から10のランダムな数を計算して、5が出るまで繰り返す処理は下記のように書けます。算出した値が5でない限りループ処理を実行するようにしています。
Dim num As Integer Do num = Int(Rnd * 10) + 1 Debug.Print "算出した値は" & num & "です" Loop While num <> 5
まとめ
条件を満たしている限りループし続けるDo ~ Loop文を解説しました。繰り返し処理を書きたいけど、ループ回数がわからないときにオススメです。
For文と合わせてDo ~ Loop文も使いこなせるようになれば、繰り返し処理は完璧!書き方を覚えるだけなので、しっかりマスターしましょう。