DoWhileで無限ループさせないための工夫
Do While ~ Loop を使ったプログラムでは、開発途中のミスで無限ループになってしまう事があります。このような事を防ぐためのアイデアを考えてみました。
無限ループに入って困ることは、止める事ができなくなり、仕方なく強制終了させるとそれまで書いたコードが保存されていない点です。
止められない、保存されないという2点について対策を考えてみます。
Stop命令を使う
Stop を Do Whileループの中に書いておけば、ブレークポイントをセットした時と同じようにプログラムを止めてくれます。
最初はこれで動作を確かめながら開発を進め、最後は、Stopをコメントアウトするなりして無効化します。これで開発中のうっかりミスにも気づくことができます。
Sub DoWhileLoopTestCode01()
Dim i As Long
i = 0
Do While i < 10
Debug.Print i
i = i + 1 ’これを書き忘れると無限ループに!
Stop
Loop
End Sub
この方法の欠点は、毎回止まってしまうので何度も繰り返すような処理では煩わしくなってしまいます。
カウンタ変数でループに上限を設ける
Whileの条件式が、カウンタ変数と関係のないような場合には、カウンタ変数が適当に大きな値となった時に止まるようにIf文を加えると良いでしょう。
こうすれば無限ループになりそうなケースでも短時間で抜ける事が出来ます。
Sub DoWhileLoopTestCode02()
Dim i As Long
i = 1
Do While Cells(i, "A") <> "最後"
Debug.Print i
i = i + 1
If i > 100 Then Exit Do
Loop
End Sub
わざわざカウンタ変数を設けるのは、煩わしいかもしれませんが、転ばぬ先の杖です。
ブックを上書き処理を置く
無限ループ後、強制終了するとそれまでのファイルの状態が失われる事があります。
Do While の前に現在のブックを毎回上書き保存しておく事で、最悪でも直前のプログラムコードは確保できます。この場合も開発が完了したらコメントアウトするなどして無効化します。
Sub DoWhileLoopTestCode03()
Dim i As Long
ActiveWorkbook.Save 'アクティブブック上書き保存
i = 1
Do While Cells(i, "A") <> "最後"
Debug.Print i
i = i + 1
If i > 100 Then Exit Do
Loop
End Sub
DoWhileを使うのはどんな時?
例えば、ブック内の全てのシートに対して処理を行うような場合、ブック内にいくつのシートがあるか予めわかっていない場合もあるので、Do Whileを使う事が多いようです。
このようにDo Whileを使うケースは、何回ループすれば良いかわからないような場合 に使うのがセオリーのようです。このような条件を根拠にして使い分ければ、後からメンテナンスを行う際に状況をつかみやすくなるのかもしれません。
ただ、Do Whileを使わなくても、For文で代用する事は可能な場合が多いので、For文を採用するというのもアリだと思います。(初心者であれば特にそうです。)
For文は構造的に非常に解りやすいので、初心者のうちはFor文を多用して慣れてきてからDo While に挑戦する方が良いと思います。
ただ、ネットのサンプルでDo While を使っている場合は、初心者のうちは書き換えるのが難しい場合もあるでしょう。そのような時は、Stopを入れて改造してみてはいかがでしょうか。
コメント