プロシージャをタイマー実行する。
時刻指定もしくは一定時間後にVBAのプロシージャを実行させるにはApplicationオブジェクトのOnTimeメソッドを利用することでタイマー実行ができます。
※OnTimeメソッドでタイマー実行した場合、実行の制御はExcelで行うのでVBAを実行したExcelは開いた状態にしておく必要があります。閉じてしまうと実行されません。
OnTimeメソッドには下記の引数が設定できます。
| 引数名 | 説明 | 省略 | |
| 第1引数 | EarliestTime | プロシージャを実行する時刻を指定 | 不可 |
| 第2引数 | Procedure | プロシージャ名を指定 | 不可 |
| 第3引数 | LatestTime | プロシージャの実行が可能になる最も遅い時刻。 | 可 |
| 第4引数 | Schedule | 新しい OnTime プロシージャをスケジュールする True:新しくスケジュール(既定値)、False:以前の設定を解除 | 可 |
OnTimeメソッドの第1引数には実行したい時間を指定するので、一定時間後に実行させたい場合は第1引数に現在時刻に希望の一定時間を足した時刻を指定します。
また実行させるプロシージャに引数がある場合は、第2引数のプロシージャ名+(半角スペース)+引数までをシングルクォーテーションで囲み、そのシングルクォーテーションの外側をさらにダブルクォーテーションで囲みます。
文字列(文字型の変数)を引数にする場合はその引数をダブルクォーテーションで囲む必要があります。(サンプルコードの「●実行するプロシージャに引数を付けて実行」参照)
引数が数値型であればダブルクォーテーションで囲む必要はありません。
また引数が複数ある場合は引数間をカンマ区切りにします。
●時刻指定実行
'*****************************************************************
' タイマー実行(時指定刻)
'*****************************************************************
Sub setProcTimer()
'現在時刻
Debug.Print "現在時刻 " & Time()
'起動指定時刻
Dim sTime As String
sTime = "20:18:00"
Debug.Print "起動指定時刻 " & sTime
'指定した時刻にrunTimeプロシージャを実行
Application.OnTime sTime, "runTime"
End Sub
'*****************************************************************
' テスト実行
'*****************************************************************
Sub runTime()
Debug.Print "------------------------------------------------"
Debug.Print "runTime()実行"
Debug.Print "指定の時刻" & "(" & Time() & ")に実行しました。"
End Sub■実行結果

●n秒後を指定
'*****************************************************************
' タイマー実行(n秒後指定)
'*****************************************************************
Sub setProcTimer2()
'現在時刻
Debug.Print "現在時刻 " & Time()
'10秒後に指定したプロシージャを実行
Application.OnTime Now + TimeValue("00:00:10"), "runTimer10sec"
End Sub
'*****************************************************************
' テスト実行
'*****************************************************************
Sub runTimer10sec()
Debug.Print "------------------------------------------------"
Debug.Print "runTimer10sec()実行"
Debug.Print "10秒後に実行しました。(" & Time() & ")"
End Sub■実行結果

●実行するプロシージャに引数を付けて実行
※引数に日時系の関数(Time関数やNow関数など)など値が動的に変わる関数を指定した場合、タイマー設定した時点の値ではなく呼び出されるプロシージャが実行された時点での値になります。
'*****************************************************************
' タイマー実行(引数あり)
'*****************************************************************
Sub setProcTimer3()
'現在時刻
Debug.Print "現在時刻 " & Time()
'1:10秒後に実行
'引数のあるプロシージャを実行(引数に文字列を設定)
Application.OnTime Now + TimeValue("00:00:10"), "'runTimerArgu1 ""10秒後を指定""'"
'2:20秒後に実行
'引数のあるプロシージャを実行(引数にTime関数を設定)
Application.OnTime Now + TimeValue("00:00:20"), "'runTimerArgu1 Time()'"
End Sub
'*****************************************************************
' テスト実行
'*****************************************************************
Sub runTimerArgu1(getDate As Variant)
Debug.Print "------------------------------------------------"
Debug.Print "runTimerArgu1(getDate As Variant)実行"
Debug.Print Now() & " に実行(引数:" & getDate & ")"
End Sub■実行結果

●実行するプロシージャに複数の引数を付けて実行
'*****************************************************************
' タイマー実行(複数の引数あり)
'*****************************************************************
Sub setProcTimer4()
'現在時刻
Debug.Print "現在時刻 " & Time()
'第1引数の設定(現在日時を文字列に変換)
Dim sSetDate As Date
sSetDate = CStr(Now)
'第2引数の設定(数値)
Dim lSecond As Long
lSecond = 10
'タイマー実行。引数に変数(文字型、数値型)の2つを設定
Application.OnTime Now + TimeValue("00:00:10"), _
"'runTimerArgu2" & Space(1) & """" & sSetDate & """" & "," & lSecond & "'"
End Sub
'*****************************************************************
' テスト実行
'*****************************************************************
Sub runTimerArgu2(getSet As String, getSec As Long)
Debug.Print "------------------------------------------------"
Debug.Print "runTimerArgu2(getSet As String, getSec As Long)実行"
Debug.Print Now() & " に実行"
Debug.Print "「" & getSet & "」の" & getSec & "秒後に実行。 "
End Sub■実行結果



