和風スパゲティのレシピ

日本語でコーディングするExcelVBA

Do While~Loop と Do~Loop While の違い

繰り返し処理(ループ)を行うためのステートメントである、
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文で書いてあげることをおすすめします。


詳しくはこちらの記事をどうぞ

www.limecode.jp