Excel VBAの場合、Do~Loop文でなければ書けないケースが少ないため、最初に学習するループ処理としてFor~Next文を、拙著『いちばんやさしいExcel VBAの教本』ではおすすめしています。
For~Next文で書けるループ処理をあえてDo~Loop文で書くと、どのようなプロシージャになるのかご紹介しておきます。
Do~Loop文を使ったサンプルマクロ
Lesson 42「For~Next文の基本を学習しましょう」で作成している、B1:B5セルに文字列「合格」を入力するFor~Next文を、Do~Loop文を使って書いてみると、以下のようなSubプロシージャになります。
Dim i As Long i = 1
Do
Range("B" & i).Value = "合格"
i = i + 1
If i > 5 Then Exit Do
Loop
End Sub
ローカルウィンドウで変数iの値がどう変化するのか、Rangeオブジェクトを取得するコード「Range("B" & i)」がどのセルを表すのかを、しっかり意識しながらショートカットキー[F8]でステップ実行してみてください。
Exit DoはDo~Loopを途中でExit指示
Do~Loop文の途中に登場する、
If i > 5 Then Exit Do
は、拙著p.154のワンポイント「Exit SubでSubプロシージャを途中でExitできる」で解説している「Exit Sub」と仲間の指示です。
「Exit Sub」で、SubプロシージャをExitするのと同様、
「Exit Do」なら、Do~LoopをExitします。
Do~Loop文を使ったサンプルマクロの解説
Do~Loop文の意味を確認しましょう。
For~Next文の場合、Forの行とNextの行の間に書かれている指示が繰り返し実行さるのと同様、Do~Loop文も、Doの行とLoopの行の間の指示が繰り返し実行されます。
上記のSubプロシージャの場合、
Range("B" & i).Value = "合格"
i = i + 1
If i > 5 Then Exit Do
の3行が繰り返されます。
For~Next文の場合は、
Range("B" & i).Value = "合格"
という1行しか書かれていなかったのに対して、指示が増えています。
増分値
Do~Loop文内の、
i = i + 1
は、変数iに「1」を加算する指示です。これはFor~Next文の 「Step 1」
For i = 1 to 5 Step 1
に該当します。
最終値
Do~Loop文内の、
If i > 5 Then Exit Do
は、iが5より大きくなったらDo~Loop文をExitしなさいという意味です。For~Next文の「To 5」
For i = 1 To 5 Step 1
に該当する指示です。
初期値
もうひとつのFor~Next文との違いがDo~Loop文に入る前の、
i = 1
です。これはFor~Next文の「i = 1」
For i = 1 To 5 Step 1
に該当します。
つまりFor~Next文の場合、
For i = 1 To 5 Step 1
の1行に書かれていることが、
i = 1
Do
i = i + 1
If i > 5 Then Exit Do
と、あちこちに分散して書かれることになります。
For~Next文を最初に学習すべき理由
For~Next文ならば、
For i = 1 To 5 Step 1
と1行にまとめて書かれることが、
i = 1
Do
i = i + 1
If i > 5 Then Exit Do
と、あちこちに分散して書かれることで、どれかを書き間違える可能性が高く、結果的に無限ループ(ループ処理がいつまで経っても終わらない状況)に陥る危険性も、For~Next文より高いといえます。
そのためExcel VBAで初めてプログラミングを学習する方に、最初に習得すべきループ処理として、For~Next文をおすすめしています。
最終更新日時:2019-12-18 16:08
Home » いちばんやさしいExcel VBAの教本 » For~Nextで書けるループ処理をあえてDo~Loopで書いてみる