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