VBA43_実用的デバッグの基本

おはようございます! Benです。プログラムの不具合であるバグを取り除くことをデバッグと言いますが、前回は変数の値を確認する方法としてウォッチ式の活用を紹介しました。今回はの自己流ですが、イミディエイトウィンドウを使ってみましょう。

20160417a.png
復習ですが画面構成です。ご覧の例では画面左下がイミディエイトで、設定によってはウォッチ式とタブで切替する場合もあります。ない場合は表示メニューからイミディエイトウィンドウを選択しましょう。

Sub Retry()
  Dim i As Integer, OK As Boolean
  OK = False '初期化
  For i = 0 To 2
    '処理を記載
    OK = True '正常処理できたことにします
    If OK = True Then
      Debug.Print "処理完了"
    Else
      Debug.Print "処理失敗:リトライ" & i
    End If
  Next
End Sub
今回のコードです。これは特定の処理を行い失敗したときには再度処理を実行するもので、成功したら終わり、失敗したら2回までリトライするプログラムです。2行目の変数定義でiはループ用、OKは処理が正常完了ならTrue、失敗ならFalseのブール型です。3行目でOKを初期化 4~12行目でi=0~2までループ、5,6行目で所定の処理が成功したことにします。7行目は変数OKで条件分岐して成功なら8行目、失敗なら10行目を実行するものです。

20160418a.png
これを実行した結果、イミディエイトウィンドウにはご覧のような出力がありました。先ほどのDebug.Printはイミディエイトウィンドウに出力しなさいという命令です。しかし、処理成功なのに何で3つも出力されるのか、ブレークポイントを設定してデバッグしてみましょう。

20160418b.png
前回とは違い、いっぱいつけてみました。変数の値の確認は所定の処理が終わった後くらいにブレークポイントを設置するくらいでいいでしょう。でも、今回のように流れがおかしそうなときは様々なポイントに設置して、繰り返し処理や条件分岐が正しく動作しているかチェックする必要があります。

20160418c.png
実行してみました。止まったときは変数の上のポインタをあてると変数の現在値が表示されます。
20160418d.png
では、イミディエイトウィンドウでも見てみましょう。変数の値を見るには?の後に見たい変数や式を入力してエンターキーを押します。また、そのまま式を入れて入力すると変数の値とかを変えることができます。プログラムの動きが変わってしまうのであまりやりませんが、もし値が○○だったらどういう動きをするか?など検証するときに便利です。

20160418e.png
2回ほど再実行するとOKの条件分岐に来て、無事Trueの処理に分岐されました。この後が問題です。

20160418e2.png
ループの折り返し地点のNextまで来ました。このときの変数iの値をイミディエイトウィンドウで調べてみるとゼロ。Nextで1増えても2以下なのでループで戻ってしまいます。正常完了のときはループを抜けるようにしましょう。

20160418f.png
ということでご覧のように正常官僚のときはExit Forで強制的にFor~Nextループから脱出するよう付け足しました。その結果、ご覧のようにイミディエイトウィンドウには1個だけしか表示されなくなりめでたしめでたしです。Exit Subの代わりにi=2を入れてもこの場合解決です。デバッグのやり方が上手いか下手かでプログラムの作成効率がかなり変わります。その基本編でした。

この記事へのコメント


この記事へのトラックバック