繰り返し処理(ループ)を行うためのステートメントである、
Do While~Loop文と、Do~Loop While文の違いを解説します。
同じところ
どちらも繰り返し処理(ループ処理)を行うためのステートメントです。
両者とも条件式によってループを続けるかを判定し、
「条件式を満たす間」ループ処理を続けます。
違うところ
条件式を書く場所が違います。
例えばA1セルからA10セルを処理する場合は、
R = 1 Do While R <= 10 Cells(R, 1) = ○○ R = R + 1 Loop
R = 1 Do Cells(R, 1) = ○○ R = R + 1 Loop While R <= 10
このようにWhileとそれに続く条件式は、
Doの後に書いても、Loopの後に書いても同じ処理がなされます。
こう見ると一見まったく同じものに見えますが、細かい違いがあります。
「R = 11」のように、初めから条件式を満たさずにスタートした場合でも、
Whileをうしろ(Loop)に書いた場合は、最初の1周だけは実行されるという特徴があります。
対してWhileをまえ(Do)に書いた場合は、条件を満たさずスタートすると第1周も実行されず、Do~Loopまでが丸ごとスキップされます。
使い分け
どちらかを使うのであれば、Do While~Loopを使うことをおすすめします。
ほとんど同じ動きをするのであれば、多くの人が知っている方で書くべきだからです。
Do~Loop While文は、そう書けることを知らない人にとっては、
上からコードを見ていくときに、ただのDo文に見えますからね。
特に、先ほど紹介した「条件を満たさなくても1周目は実行」という特徴を、
Do~Loop While文で表現しようとしてはいけません。
- この書き方ができる
- この書き方ならば、1周目は必ず実行される
- その仕様を、なにかの意図をもって活用した
この3点すべてに気付けないと読めない、
とても読みづらいコードになります。
暗黙の仕様をうまく使ったコードは、基本的に読みづらいものだと思いましょう。
今回の「Whileを書く位置の違い」は、暗黙の仕様のないただのDo~Loop文を使うと、
' Do While~Loop の書き換え R = 1 Do If R > 10 Then Exit Do Cells(R, 1) = ○○ R = R + 1 Loop ' Do~Loop While の書き換え R = 1 Do Cells(R, 1) = ○○ R = R + 1 If R > 10 Then Exit Do Loop
こんな風に、If~Exit Doの位置を変えることで、どストレートに表現できます。
R = 11 とした際に、後者だけは1周目が実行されるのも、見ればわかりますね。
ということで、どちらかを使うのであれば、Do Whileを使うと書きましたが、
最終的な結論としては、どっちも使わず全部Do~Loopでいいと思います。
Whileを使うより、If~Exit Doを明示したほうが、
いつ終了するかが明確ですからね。
個人的にDo While文は
- For文ほど読みやすく簡潔には書けない
- その割にはDo~Loop文ほど自由が利かない
という印象です。
帯に短し襷に長し。
ループ処理に慣れていない方は、
Do~Loop文の中で、丁寧にIf~Exit Doを書いた方が読みやすいと思います。
Do Whileをスラスラ読めるレベルの方も、少しのコード量の差なら
のちに引き継ぐかもしれない後輩のためにもDo~Loop文で書いてあげることをおすすめします。
詳しくはこちらの記事をどうぞ