Timerを使って5秒おきに実行する関数を造りたい

お世話になります。以下のコードで5秒おきに関数を実行したいのですがoTimer.addActionListenerの行で「オブジェクト変数は設定できていません。」というエラーが発生します。
ネット上様々検索をかけたのですが該当の情報がなかなか見つかりません。
この5秒おきに実行するコードを実現したいです。
ご助力お願いいたします。

※waitでの実装はメモリなどへの影響から考慮しません。

Sub timer_start()

Dim oTimer As Object

    If IsNull(oTimer) Then '二重起動防止
        oTimer = CreateUnoService("com.sun.star.awt.XTimer") 'タイマーサービスを作成
        oTimer.addActionListener(CreateUnoListener("aaa_", "com.sun.star.awt.XActionListener")) 'イベントハンドラを設定
        oTimer.Start(5000) 'インターバルを5000ミリ秒(5秒)に設定してタイマーを開始
    End If
End Sub

Sub timer_event(oEvent As Object)
    'タイマーイベントの処理
    MsgBox "Timerイベント発生!", 0, "確認"
End Sub

Sub timer_stop()
    If Not IsNull(oTimer) Then
        oTimer.Stop()
        RemoveHandler oTimer.Timer, "timer_event" 'イベントハンドラを削除
        oTimer.Dispose()
        oTimer = Null
    End If
End Sub

職場からの帰宅途中だったのでとりあえずダメ元で回答書いて外れだったので削除したけれども…

そもそもawtのXTimerってどのドキュメントに出てきた?全然検索にヒットすらしないんだけども

ありがとうございます。
なにかとAIが便利なので頼ってしまい。確認を怠っていました。先ほど確認しましたがドキュメントにはXtimerはないみたいです。
他にもドキュメントを見ていますがどうやら〇秒待って実行のようなコードはないかもしれません。ドキュメントでtimeと検索しても出るのは時間を返すものがほとんどです。

わりといい加減なコード
24時をまたぐと失敗しそう

Dim bRunning As Boolean

Sub timer_start()
	Dim t1 As Long
	Dim t2 As Long
	If bRunning=false Then
		bRunning = True
		t1 = timer()
		do while bRunning
			t2 = timer()
			If t2 - t1 >= 5 then
				call timer_event
				t1 = t2
			End If
		loop
	End If
End Sub

Sub timer_event()
msgbox "aaa"
End Sub

Sub timer_stop()
	bRunning = False
End Sub
1 Like

ありがとうございます!
確かにtimer()の挙動上24時が怖いですね、、、

教えていただいたコードを参考に
Now + TimeValue("00:00:05")
で現在から+5秒の間隔で動作させることを考えてみました。
明日にでもコードを動かしてみようと思います。

1 Like

ご協力ありがとうございました。
頂いたコードを参考に現時刻から5秒加算した時間で動作するようにしてみました。
特に問題なく稼働中です。

Sub StartTimer()



    Dim nextTime As Double
    nextTime = Now + TimeValue("00:00:05")

    Do
        If Now >= nextTime Then
            MyFunction
            nextTime = Now + TimeValue("00:00:05")
        End If
        Wait 100'0.1秒ごとに処理
    Loop
End Sub
2 Likes