現在、VBA でタイマー クラスを実装しようとしています。そのために、Windows API の SetTimer および KillTimer 関数を使用します...
これは Msdn からのインターフェイスです:
UINT_PTR WINAPI SetTimer(
__in_opt HWND hWnd,
__in UINT_PTR nIDEvent,
__in UINT uElapse,
__in_opt TIMERPROC lpTimerFunc
);
これは、VBA モジュール内で関数を宣言した方法です。
Private Declare Function SetTimer Lib "user32" (ByVal Handle As Long, _
ByVal TimerIDHandle As Any, _
ByVal ElapseTime As Long, _
ByVal AddressOfAndYourHandlerFunctionName As Long) As Long
'TimerIDHandle is of Type Any so I can pass Nothing to the function
次に、この方法で関数を呼び出します。
Dim TimerID As Long
TimerID = SetTimer(Application.hWndAccessApp, ByVal 0&, Timer.Timeout, AddressOf TimeOutHandler)
Vba は「Null」を受け入れないため、「ByVal 0&」を実装してみました。これは正しい方法ですか?とにかく...同じアプリケーションからこの関数を数回呼び出しますが、関数は常に識別子として 1 を返しますが、Msdn によれば、関数は現在のウィンドウ ハンドルで作成された各タイマーに対して一意の ID を返す必要があります。アプリケーションにアクセスします。
さらに、タイマーを 1 つだけ作成すると、コールバック関数が呼び出されますが、タイマー ID は 0 として指定されますが、Settimer-Function は初期化時に 1 を返します。ここに私のコールバック関数ヘッダーがあります:
Private Sub TimeOutHandler(ByVal WindowHandle As Long, _
ByVal TimerMessage As Long, _
ByVal TimerID As Long, _
ByVal ElapsedTime As Long)
どこが間違っていますか?
もちろん、どんな助けも大歓迎です;-)