オーバーフローしました
先日パソコンを新しいのに変えたのだが、株用の監視プログラム(楽天RSS+VBA)で謎のエラーが出るようになった。前のパソコン上では問題なく動いていたのに。
原因は、とても恥ずかしいバグだった。
こういうの。
Dim timerCounter As Integer 'タイマーから0.5秒おきに繰り返し呼ばれる処理 Sub TimerProc ... timerCounter = timerCounter + 1 ... End Sub
上のカウントアップしてる処理で
実行時エラー'6': オーバーフローしました
が発生していた。
サブルーチンは0.5秒ごとに呼び出していて、
1時間に60(秒)×60(分)×2 = 7200 カウントアップし、5時間も動かすと
Inegerの上限の32767を超えてオーバーフローになってしまっていた。
VBAのIntegerって4バイトじゃないんだ!てか範囲越えるとオーバーフローになるんだ!
とか今更気づく
前のパソコンは、タスクで昼にシートの再起動を行っていた(連続3時間程度の稼働ですんでいた)のだが、
新しいパソコンでは、そのタスクを入れるのを忘れていた。
こんなエラーすぐ発見できそうなもんだが、ここを特定するまでにけっこう時間を食った。
というのも、タイマーはWindowsAPIのSetTimerで呼び出していたんだが(1秒未満はApplication.OnTimeじゃできないので)、このSetTimerが曲者で、実行時エラーがスローされるとEXCELプロセスを巻き込んで落ちてしまう。
で、落ちないように、On Error Goto でエラーを補足して、SetTimerまでスローしないようにしていたんだが、
そうすると、エラーが発生しても、発生行がわからない(VBAのErrオブジェクトはなぜに発生行のプロパティーがないんだろう?)。
けっこう長いこと使ってるプログラムでもう不具合もないだろうということで、SetTimerに変えたのだが、何か起きたときに、これじゃやりにくくて仕方ないなぁ。
こんなしょうもないバグと格闘とか、不毛の人生がますます不毛になった気分。