支援対象地域:札幌、仙台、関東、愛知、関西、広島、福岡

  • TOP
  •   
  • コラム
  •   
  • VBA Sleep関数について、同じ

VBAで、一定時間処理を止めたり、待ったり、逆に指定の時間に処理を実行するための方法としてSleep関数やWaitメソッド、DoEvents関数、OnTimeメソッドがあります。今回はそれぞれの関数やメソッドについて紹介しします。

Sleep関数とは

VBAの関数ではなく、Windows API(Application Programming Interface)の関数です。ちなみにVBAを使用すればSleep関数以外のWindowsで用意されているAPI関数の機能を利用することができます。Sleep関数では処理を止めるための時間をミリ秒(1/1000 秒)単位で指定することができます。(1秒を指定する場合は「sleep = 1000」)
またSleep関数を使用するには使用の宣言文をコードの最初に記入する必要があり、お使いのPCのOSが64ビット版か32ビット版かで宣言の内容が少し変わります。

Sleep関数の実用例

・コードの一番初めに「Private Declare PtrSafe Sub Sleep Lib “kernel32” (ByVal dwMilliseconds As LongPtr)」(64ビット)か「Private Declare Sub Sleep Lib “kernel32” (ByVal dwMilliseconds As Long)」を記入します。操作環境のビットがあっていないとエラーが出ます。

*どちらかわからない場合はIFステイトメントを用いることにより、ビットの値に関係なく、Sleep関数を利用できます。

・実際にSleep関数のサンプルコードで実行結果を確認してみます。コードの内容は実行して30秒後に表示したというメッセージを表示するというものです。Sleep関数を実行している場合はexelで何か操作を繰り返し行うと、画面が白みがかり、excelでの操作は一切できません。

Waitメソッドとは

実行中のマクロの処理を指定の時刻まで停止することができます。Waitメソッドはexcelのすべての動作を制止させますが、それ以外のバックグラウンド処理(印刷、再計算など)は続行されます。ちなみにメソッドとは、オブジェクトを操作する命令文のことでオブジェクトの動作になります。 通常「Application.Wait "時間:分:秒" 」という形で記入し、何時何分何秒まで停止するという処理を行います。

Waitメソッドの実用例

・実行すると、現在の時刻から10秒間停止した後にメッセージで「10秒間停止しました」と表示させます。

*実行するとSleep関数のようにexcelの操作は受け付けません。

・Microsoftの公式サイトからサンプルコードを引用しましたが、他にも違う書き方で、処理を停止することができます。(変数のデータ型をVariantで宣言して日時を指定する代わりに変数を指定するやり方、Application.Wait()の()内にnowとTimeValue関数を代入して停止する時間を設定)

画像

DoEvents関数とは

時間のかかるループ処理の途中でOSに制御を移すための関数です。通常処理の途中に画面をクリックしたり、キーを入力しても処理が終わるまで反映はされませんが、DoEvents関数を使用することにより、一時的にOSに制御を移して、処理を行うことができます。
長期のループ処理や無限ループに陥った場合に利用します。ただしDoEvents関数を呼び出すと、実行している処理が安定せず、処理時間が長くなることがあるので注意する必要があります。

DoEvents関数の実用例

・Microsoftの公式サイトからサンプルコードを引用しましたが、実行するとDoEvents 関数を使用して、1,000 回ループするごとに1回、オペレーティング システムに制御を渡す内容になっています。

画像

OnTimeメソッドとは

指定された時刻にマクロを実行させたい時や現在の時刻から処理を実行させるときに使用します。OnTimeメソッドの構文は「Application.OnTime(EarliestTime, Procedure, LatestTime, Schedule)」です。

・EarliestTime:実行する時刻(必須)
・Procedure:実行するプロシージャ名(必須)
・LatestTime:プロシージャが指定時刻に実行できない場合の待機時間(省略可)
・ Schedule:プロシージャを実行するか、終了するかの設定(省略可)

OnTimeメソッドの使用例

例では5秒経過したら、時間だというメッセージを表示する内容になっています。プロシージャと引数は、全体をシングルクォーテーション(')で囲み、引数をダブルクォーテーション(")で囲みます。書き方が分かり辛いので注意です。

まとめ

今回紹介した4つの中で、個人的にDoEvents関数とOnTimeメソッドのコーディングが難しかったです。VBAを上手く活用するために、とにかくコーディングすることが上達への近道といえるでしょう。