Excel VBAで作る自動売買用ロボット:VBAの実行を停止する方法(Sleep関数等)

自動売買用ロボット

VBAのステートメントが実行されても、結果として実行内容が完了するまでにタイムラグが生じてしまうような場合があります。

次のステートメントが前のステートメントの実行完了を前提としたステートメントだった場合、前ステートメントの実行完了前に次のステートメントが実行されてしまうと結果として不整合が生じエラーとなってしまいます。

ロボットファイルの場合、このトラブルは注文画面をIE操作で呼び出し、該当画面のエレメントにデータを流し込む過程等でよく発生します。

画面の遷移に時間がかってしまうとまだターゲットのエレメントが存在しない状態の時にエレメントを指定してしまうのでエラーとなってしまいます。

そのような場合は一定時間VBAの実行を止めてタイミングを調整してみるしかありません。

VBAの実行を止める方法はいくつかあります。

ここでは下記の3方法について解説していきます。

・Windows APIのSleep関数で止める

Waitメソッドで止める

DateAdd関数で止める

Sleep関数で止める

Sleep関数はVBAの関数ではなくWindows APIの関数です。

ですので、使用する際には最上位モジュールの宣言セクションで下記のような宣言が必要です。

PCのOSが32ビット版か64ビット版かによって宣言方式が異なります。

・PCのOSが32ビット版の場合

Declare Sub Sleep Lib “Kernel32” (ByVal dwMilliseconds As Long)

・PCのOSが64ビット版の場合

Declare PtrSafe Sub Sleep Lib “Kernel32” (ByVal dwMilliseconds As LongPtr)

Sleep関数の使い方は簡単です。

Sleep 待機指示時間(単位はミリ秒)

1秒待機なら

Sleep 1000

です。

Waitメソッドで止める

Waitメソッドを使用する場合はSleep 1000の代わりに、

Application.Wait (Now + TimeValue(“00:00:01”))

と記述します。

もし待機指示時間を1秒未満にしたい場合は、上記の形式では指定できません。

その場合、例えば100ミリ秒ならば、

Application.Wait [Now() ] + 100 / 86400000

のように指定します。

86400000は1日のミリ秒数です。

DateAdd関数で止める

DateAdd関数は日付や時間に特定の間隔を追加してその結果を返す関数です。

止めたい時間が1秒未満の場合はこの方法は使えません。

コーディング例です。秒単位ということで第1引数は”S”を指定しています。↓


呼び出し側プロシージャで

Call 処理待機(2)とすれば、

再開時刻には現在時刻に2秒加算された時刻がセットされ、その時刻になるまで処理が止まります。

画面表示完了確認時のSleep関数使用例

下記のコードは画面表示完了確認の1例です。↓

一般的には、画面の表示が完了したか否かは上記例のようにBusyプロパティ(Internet Explorerの処理状況)やdocument.readyStateプロパティ(documentオブジェクトの読み込み状況)、もしくはreadyStateプロパティ(IEオブジェクトの読み込み状況)の戻り値を見て判定しますが、画面によってはそれだけではうまくいかないケースもあります。

そのような場合、上記例のようにSleep関数等でVBAの実行を止めてみます。

画面遷移が完了する時間は環境によっても異なりますのでいろいろ試してみるしかありません。

ちまみに画面表示完了判定時のループ中のDoEventsは一旦制御をOSに戻す命令です。

OSがキューのイベントの処理を終了し、SendKeys キュー内のすべてのキーが送信された後、制御はVBAに戻されます。

ということで、この命令も結果的にVBAの実行を止めています。

まとめ

以上、処理タイミングの調整に適した

・Windows APIのSleep関数
Waitメソッド
DateAdd関数

の使用方法についての解説でした。

タイトルとURLをコピーしました