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ミリ秒未満の値を切り捨てています。

関連ページ