VBA, Visual Basic for Applications は、マイクロソフト社が Microsoft Visual Basic を、同社製品の Microsoft Office に搭載したものです。VBA を使用することで、Excel、Access、Word、Outlook、PowerPoint など、Office のアプリケーション・ソフトウェアの機能をカスタマイズしたり、拡張したりすることができます。
自分は Linux ユーザーですので、いままで熱心には VBA を利用してきませんでした。ところが Excel 上でなければできないことがあり、やむなく Excel を購入して VBA のプログラミングに取り組んでいます。
下記の OS 環境で動作確認をしています。
Microsoft Windows 11 Home | 24H2 | |
Microsoft Excel 2024 MSO | 64 ビット |
VBA で一定時間間隔の処理
Excel 上において、一定間隔でデータを取得する必要があったので VBA でどうするのかを調べました。その結果、Win32 API の 関数を利用する方法が最も用途に合っていたので利用することにしたのですが、自分が理解したことを残しておくために備忘録としてまとめました。
利用する Win32 API
タイマーを開始する SetTimer 関数 [1] と、タイマーを止める KillTimer 関数 [2] を利用します。
UINT_PTR SetTimer( [in, optional] HWND hWnd, [in] UINT_PTR nIDEvent, [in] UINT uElapse, [in, optional] TIMERPROC lpTimerFunc );
SetTimer 関数は、指定したタイムアウト値を持つタイマーを作成します。
この関数の実行に成功したとき、hWnd パラメーターが NULL (= 0) であれば、戻り値は新しいタイマーを識別する整数(タイマー ID)になります。
nIDEvent は 0 以外のタイマー ID。 hWnd パラメーターが NULL で nIDEvent が既存のタイマーと一致しない場合は無視されて、新しいタイマー ID が生成されます。uElapse にはタイムアウト値(ミリ秒)を、lpTimerFunc には、タイムアウト値が経過したときに実行する関数へのポインターを指定します。
アプリケーションは、タイマー ID を KillTimer 関数に渡してタイマーを破棄できます。
BOOL KillTimer( [in, optional] HWND hWnd, [in] UINT_PTR uIDEvent );
KillTimer 関数は、nIDEvent に指定したタイマーを破棄します。
この関数の実行に成功すると、戻り値は 0 以外(の整数)、失敗した場合は 0 を返します。この関数は BOOL 型ですが実質的に整数型です。
サンプル
参考サイト [3] の「WindowsAPI:SetTimer関数」のサンプルを引用させていただきました。ただし、参考サイト [4] などの情報を参考に、少しだけコードを修正しています。なお、コードは Excel マクロの標準モジュールに記載しています。
Option Explicit Public Declare PtrSafe Function SetTimer Lib "user32" (ByVal hWnd As LongPtr, _ ByVal nIDEvent As LongPtr, _ ByVal uElapse As Long, _ ByVal lpTimerFunc As LongPtr) As LongPtr Public Declare PtrSafe Function KillTimer Lib "user32" (ByVal hWnd As LongPtr, _ ByVal nIDEvent As LongPtr) As Long Public mTimerID As LongPtr Sub TimerProc() If mTimerID = 0 Then End '終了できない時の対策 On Error Resume Next 'デバッグ出すとExcelが固まるので Range("A1") = Now() End Sub Sub TimerStart() If mTimerID <> 0 Then MsgBox "起動済です。" Exit Sub End If mTimerID = SetTimer(0&, 1&, 1000&, AddressOf TimerProc) End Sub Sub TimerStop() Call KillTimer(0&, mTimerID) mTimerID = 0 End Sub
マクロは Excel の[開発]タブから[マクロの表示]ボタンをクリック(あるいは Alt + F8)でマクロ一覧を表示し、TimerStart でタイマーを起動します。タイマーは 1000 ミリ秒間隔で TimerProc マクロを起動します。このマクロは、ワークシートの A1 セルに現在時刻を表示します。セルの書式を変更すると秒単位で更新されていることを確認できます。
タイマーの終了は、TimerStop を実行します。
参考サイト
- SetTimer 関数 (winuser.h) - Win32 apps | Microsoft Learn
- KillTimer 関数 (winuser.h) - Win32 apps | Microsoft Learn
- VBAでのタイマー処理(SetTimer,OnTime)|VBA技術解説 [2019-04-03]
- vba - Declaration of API SetTimer? - Stack Overflow [2019-09-08]
- LongPtr データ型 | Microsoft Learn
- 条件付きコンパイル(32ビット64ビットの互換性)|VBA技術解説 [2016-08-12]
- Office Visual Basic for Applications (VBA) リファレンス | Microsoft Learn
- C++のfalseは0でtrueは非0だと思い込んでいた話 | PCの歯車 [2023-03-27]
にほんブログ村
#オープンソース
0 件のコメント:
コメントを投稿