プロシージャのタイマー実行

プロシージャをタイマー実行する。

時刻指定もしくは一定時間後に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

 ■実行結果