はじめに
20年くらい前のことです。お取引先様での常駐案件で、前任者からの引き継ぎ作業をしたのですが、あるExcel VBAのソースコードには、無限ループだけがコーディングされていました。
Excel VBA(実際には、ここまで単純ではありません)
Option Explicit
Public Sub ExecuteMugWarmer()
Do
DoEvents '' トルな!!
Loop
End Sub
前任者に 「この無限ループ、何を意図していますか?」 と聞いても、自分のあごをさするばかりです。
「発熱させるためですか!?」
(うーん、マ〇ダム!!)
終了判定のミス?
自分自身も、永久ループのコーディングをしてしまうことがあります。
例えば、ExcelシートのA列の連続データを走査し、B列に整形文字列を書き込むような処理でよくミスをします。
Excel VBA
Option Explicit
Public Sub ExecuteMugWarmer2()
Dim i As Integer
Dim s As String
With Sheet1.Range("A2")
i = 0
Do Until .Offset(i, 0) = ""
s = "TEXT:" & Format(.Offset(i, 0), "000")
.Offset(i, 1) = s
DoEvents '' トルな!!
Loop
End With
End Sub
終了判定は、正しく見えますが、行のオフセットi
が、ゼロのままですので、永久に1行目を処理し続けています。
(i = i + 1
が抜けています)
DoEvents ''トルな
示されたコードを実行する際は、DoEvents '' トルな!!
を削除しないでください。
DoEvents
を削除すると、処理を中断もしくは停止することができなくなるります。
おわりに
開発の初期段階では、Do-Loopの中に、DoEvents
を含めておくことをお勧めします。
Do-Loopが抜け出すことを確認してから、DoEvents
を削除します。