プログラムを一時停止
ExcelVBAでプログラムを一時的に停止するには、Sleep関数やWait関数をよく使います。2つの関数を見ていきます。
Sleep関数
Sleep関数は、Windous APIの関数になります。なので、プログラムの冒頭にSleep関数を使うという宣言が必要になります。
使用しているWindowsが32bitか64bitかによって宣言の内容が変わってきますので、少々面倒です。ただ、以下のように書くことで、32bitか64bitかを勝手に判断して実行されますので、おまじないのように考えて書いてしまえばOKです。
'Sleep
#If Win64 Then
Private Declare PtrSafe Sub sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As LongPtr)
#Else
Private Declare Sub sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long)
#End If
宣言はモジュールの冒頭に書くようにします。
Sleep関数の使い方
Sleep関数の使い方は非常にシンプルで、引数にミリ単位の数値を指定すればOKです。ミリとは1/1000のことですから、一秒停止させるためには、
Sleep 1000
とします。
Sleep関数のサンプルコード
'2秒ごとに選択セルを変更する
Sub SelectCellChangeSleep()
Dim i As Long
For i = 3 To 10
Cells(i, 3).Select
sleep 2000
Next i
End Sub
このコードはC3のセルから2行ごとに下に選択していき、C10で終了します。
注意して欲しいのは、プログラムが終了するまで、制御が来ないためキーボードやマウスの制御を受け付けないという点です。

Wait関数
Wait関数の本来の使い方は、ある時刻になったらTrueを返すというものです。
Wait関数の使いかた
Wait関数は、Excelの関数になりますので宣言は必要ありません。Wait関数の構文は以下のようになっています。
Function Wait(Time) As Boolean
Wait関数は、停止させるというよりは、時間になったら起動させるという用途で使用する関数です。戻り値(返り値)があり時間になるとTrueを返します。
Wait関数のサンプルコード
17時になったらメッセージを出してくれるプログラムを書いてみました。
ただし、17時になるまでExcelの画面操作は行えなくなります。別に開いたExcelも同様です。(他のアプリは操作可能です。)
もし人に渡したりするとクレームが来ると思いますので実験用としてください。
'17時になったらお知らせしてくれるVBAコード【取扱注意!】
Sub アラーム()
Dim t As String
t = "17:00:00"
Application.Wait t
MsgBox t & "になりました"
End Sub
では今度は、先程のSleep関数のサンプルコードと同じく一時停止するプログラムを書いてみます。
'2秒ごとに選択セルを変更する
Sub SelectCellChangeWait()
Dim i As Long
For i = 3 To 10
Cells(i, 3).Select
Application.Wait Now() + TimeValue("00:00:02")
Next i
End Sub
ここでは、Now() で今の時刻を出して、そこにTimeValueで時間を加算しています。
つまり、止めたい時間分、現在の時刻に足して終了時刻を割り出しているわけです。
前回と同じですが、こちらもプログラムが終了するまで制御は戻って来ません。時間がかかってしまうような処理を書いてしますと、面倒な事になりますので注意してください。
一時停止の使い道
Sleep関数やWait関数を使う場面はどんな時でしょう。
時間制御なのでタイマーなどが思い浮かぶと思いますが、図形を回転させるようなアニメーションやスライダショーなどの遅延効果に使われる事もあります。
ただ、停止させている間も制御は返ってこないためキーボードやマウスクリックを受け付けてくれません。この場合は、DoEvent関数などでスレッド処理を行うことになります。
少々トリッキーな使い方になるため注意が必要です。
どちらの関数も時間精度に関しては、あまり厳密ではないと思っていた方が無難です。ゲームのようにある程度速度が求められても、細かい精度が求められないような時は大丈夫でしょう。
コメント