VBAで指定時間だけ処理を止めるにはWindows APIのSleepを使います。
Windows APIのSleepを使用する #
指定時間だけ処理を止めるSleepは、外部プログラムの応答を待つときなどに使用します。
Option Explicit
Private Declare Sub Sleep Lib "kernel32" (ByVal ms As Long)
Sub TestSleep()
Sleep 2000
End Sub
モジュールの最初でDeclare
ステートメントを使用します。
こちらの宣言を行うことによって、Windows APIのSleep関数
を使えるようになります。
Sleep
のあとに処理を止めたい時間を指定します。時間はミリ秒で指定します。
1秒の場合はSleep 1000、2秒の場合はSleep 2000です。
ミリ秒単位でsleepさせるのが直感的でなければ、関数を作成して秒単位でスリープさせましょう。
Option Explicit
Private Declare Sub Sleep Lib "kernel32" (ByVal ms As Long)
Sub SleepSecond(mili_second As Long)
Sleep mili_second * 1000
End Sub
Sub TestSleepSecond()
Call SleepSecond(2)
End Sub
Sleepでランダムな時間停止する #
Windows APIのSleep関数とVBAのRnd関数とInt関数を使用してランダムな時間だけ処理を止めてみます。
Rnd 関数 (Visual Basic for Applications) | Microsoft Learn
Int、Fix 関数 (Visual Basic for Applications) | Microsoft Learn
ランダム時間だけ処理を止めるコードは以下になります。
Option Explicit
Private Declare Sub Sleep Lib "kernel32" (ByVal ms As Long)
Sub RandomSleep(min_second As Long, max_second As Long)
'###################################################################################
'最低min_secondから最大max_secondの間までSleepする
'-----------------------------------------------------------------------------------
'引数 :min_second 最低Sleepさせる時間(秒)
' max_second 最大Sleepさせる時間(秒)
'###################################################################################
Dim sleepTime As Long
sleepTime = (min_second * 1000) + Int((max_second * 1000) * Rnd)
sleepTime = sleepTime - (sleepTime Mod 1000)
Debug.Print "sleepTimeは" & sleepTime
Sleep sleepTime
End Sub
Sub TestRandomSleep()
Call RandomSleep(1, 5)
End Sub
RandomSleep
がランダム秒数分だけ、処理を止めるSubプロシージャになります。
最低スリープ秒数を引数min_second
、最大スリープ秒数を引数max_second
に設定すると
その範囲内からランダムに秒数を算出して、処理を停止します。
TestRandomSleep
を実行するとRandomSleep
を呼び出します。
上記のコードはCall RandomSleep(1, 5)
と指定しているので、1~5秒の間で処理を停止します。
Rnd関数は、0以上1未満の値を返します。Int関数は小数点を切り捨てを行い、整数値を返します。
sleepTime – (sleepTime Mod 1000)
で1000ミリ秒未満の値を切り捨てています。