プログラムを一時停止

中級VBA

プログラムを一時停止

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関数などでスレッド処理を行うことになります。
 少々トリッキーな使い方になるため注意が必要です。

 どちらの関数も時間精度に関しては、あまり厳密ではないと思っていた方が無難です。ゲームのようにある程度速度が求められても、細かい精度が求められないような時は大丈夫でしょう。

コメント

タイトルとURLをコピーしました