あえて茨の道を行ってみる。
Windowsのタイマー機能を使うことでPCとExcelにできるだけ負荷を掛けない手法。
Public Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Public Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
Private hTimer As Long
Private dtNext As Date
Private strMethod As String
' 1秒ごとに呼び出されるコールバック関数
Private Sub TimerProc(hwnd As Long, uMsg As Long, idEvent As Long, dwTime As Long)
' 指定時刻を経過したら
If Now > dtNext Then
' メソッド名で分岐
Select Case strMethod
Case "test1": Call test1
Case "test2": Call test2
End Select
' 5分後を記憶
dtNext = DateAdd("n", 5, Now)
End If
End Sub
' タイマー開始(開始ボタンのクリックイベント内でこれを呼び出す)
Public Sub StartTimer()
' すでにタイマーが稼働していたら何もしない
If hTimer <> 0 Then Exit Sub
' タイマースタート、同時に5分後の時刻と最初に呼び出すメソッド名を記憶
hTimer = SetTimer(0, 0, 1000, AddressOf TimerProc)
dtNext = DateAdd("n", 5, Now)
strMethod = "test1"
End Sub
' タイマー停止(停止ボタンのクリックイベント内でこれを呼び出す)
Public Sub StopTimer()
' すでにタイマーが停止していたら何もしない
If hTimer = 0 Then Exit Sub
' タイマー停止
Call KillTimer(0, hTimer)
hTimer = 0
End Sub
Private Sub test1()
Debug.Print "test1 Called"
strMethod = "test2" ' 次回はtest2を呼ぶ
End Sub
Private Sub test2()
Debug.Print "test2 Called"
strMethod = "test1" ' 次回はtest1を呼ぶ
End Sub
補足
実行を停止するには、breakではなく ボタンで行いたいのですが、どの様にすればいいですか? すんなり停止させたいのですが。。。