Access VBAで「擬似マルチスレッド」を操る!タイマーイベントでバックグラウンド処理を極める方法
こんにちは。現場の最前線でAccessと格闘している皆さん、お疲れ様です。
Access VBAの世界では、「処理が終わるまで画面がフリーズして動かない」という経験、一度はありますよね。Accessはシングルスレッドで動く宿命にあるため、重いループ処理などを走らせると、Windowsからは「応答なし」と見なされてしまいます。
しかし、諦めるのはまだ早い。今日はAccessの標準機能である「タイマーイベント」を駆使して、メインスレッドをブロックせずに裏側で処理を回す「擬似マルチスレッド」の極意を伝授します。
—
なぜ「タイマーイベント」なのか?
通常のVBAは、上から下へ順番に処理を実行します。重い計算や外部APIとの通信を行っている間、Accessは「その処理」に専念してしまい、ユーザーの操作(ボタンクリックや画面描画)を受け付けなくなります。
ここで登場するのが `TimerInterval` と `OnTimer` です。これを使うと、「一定時間ごとに、一度だけ仕事をこなして、すぐ制御をメインスレッドに戻す」というループが作れます。これが「擬似マルチスレッド」の正体です。
—
ステップ1:タイマーイベントの準備
まずは、フォームのプロパティをどう設定するか理解しましょう。
1. TimerInterval(タイマー間隔):
- 単位はミリ秒です。「1000」と設定すれば1秒ごと、「100」なら0.1秒ごとにイベントが発生します。
- 0にするとタイマーは停止します。
2. OnTimer(タイマー時):
- タイマーが鳴るたびに実行されるイベントプロシージャです。
—
実践:非同期ステータスチェックのコード
例えば、「外部サーバーの稼働状況を監視する」という処理を考えてみましょう。メイン画面を操作しながら、裏でこっそりチェックを走らせます。
フォームのモジュールに記述するコード
Option Compare Database
Option Explicit
‘ 処理状態を管理するフラグ
Private isProcessing As Boolean
‘ フォームが開いた時にタイマーを開始
Private Sub Form_Open(Cancel As Integer)
Me.TimerInterval = 2000 ‘ 2秒ごとにチェック
isProcessing = False
End Sub
‘ タイマーイベント(ここが心臓部!)
Private Sub Form_Timer()
‘ 処理中なら重複実行を避けるため即座に抜ける(重要!)
If isProcessing Then Exit Sub
‘ 処理開始の合図
isProcessing = True
‘ ここに重い処理(API叩く、ログ書き込みなど)を記述
Call PerformBackgroundJob
‘ 処理終了
isProcessing = False
End Sub
‘ 実際のバックグラウンド処理
Private Sub PerformBackgroundJob()
‘ 例:ステータスバーへの表示(ユーザーを安心させる)
SysCmd acSysCmdSetStatus, “バックグラウンドで処理中…”
‘ ここで本来の重い処理を行う
‘ DoEventsを入れることでさらに操作性を向上させることも可能
SysCmd acSysCmdClearStatus
End Sub
—
陥りやすい罠と解決策(伝説のエンジニアからの忠告)
初学者が必ず突き当たる「壁」を先回りして解説します。
1. タイマーが「再帰」してクラッシュする
`Form_Timer` の中で時間がかかる処理をしていると、処理が終わる前に次のタイマーが起動してしまい、Accessがパンクします。
- 解決策: 上記コードの `isProcessing` フラグのように、「現在処理中なら即座に抜ける」ガード条件を必ず入れてください。
2. タイマー間隔を短くしすぎる
「1ミリ秒」で設定すれば高速化するわけではありません。むしろWindowsのメッセージループを圧迫し、画面がチラつく原因になります。
- 解決策: 業務の要求にもよりますが、人間が違和感を感じない「500ms〜2000ms」程度が適正値です。
3. エラー処理を忘れる
タイマーイベントの中でエラーが起きると、タイマーが止まってしまいます。
- 解決策: `On Error Resume Next` ではなく、必ず `On Error GoTo` でエラーを捕捉し、必要であれば `Me.TimerInterval = 0` で安全に停止させる設計にしましょう。
—
まとめ:ここをクリアすればAccessはもっと自由になる
タイマーイベントを使いこなすと、Accessは単なる「データ入力画面」から「自律的に動くエージェント」へと進化します。
- メインスレッドをブロックしない
- フラグ管理で重複を避ける
- エラー発生時の停止条件を明確にする
この3つを守るだけで、あなたの作るAccessアプリの品質は劇的に向上します。まずは空のフォームで `TimerInterval` を触ってみることから始めてみてください。
「Accessにはできない」と諦めていた機能も、実はこのタイマーの組み合わせで解決できることがほとんどです。ぜひ、今日からあなたのコードに「時間の概念」を取り入れてみてくださいね。応援しています!
