こんにちは! Access VBAでの開発、日々の試行錯誤お疲れ様です。
マクロの記録から一歩踏み出し、「自分でコードを書いてシステムをコントロールしたい!」という熱意を持っているあなたへ。今日は、Access VBAの隠れた名機能、フォームの「TimerInterval(タイマー間隔)」を使った、ちょっとワクワクするテクニックをお伝えします。
「重い処理を実行すると、画面がフリーズしてマウスも動かなくなる……」
「裏でこっそりデータの監視やログのチェックをさせたいのに、メインの操作が止まってしまう……」
こんな壁にぶつかったことはありませんか?
マルチスレッド(同時に複数の処理を行うこと)が苦手なAccess VBAにおいて、このタイマー機能は「擬似的なマルチスレッド」を実現する魔法の杖になります。
ここをクリアすれば、あなたの作るAccessアプリは一気に「プロのシステム」の動きに近づきますよ。さあ、一緒に本質をマスターしていきましょう!
—
1. なぜAccessは重い処理で固まるのか?(シングルスレッドの宿命)
私たちが普段使っているAccess VBAは、基本的に「シングルスレッド」で動作しています。これはどういうことかと言うと、「一度に一つの仕事しかできない」ということです。
例えば、VBAで何万件ものデータをループ処理している最中、Accessの画面(フォーム)は完全にフリーズしますよね。あれは、VBAがその計算に全リソースを奪われてしまい、画面の描き直しやユーザーからのクリックを受け付ける余裕がなくなっているからです。
救世主「TimerInterval」の正体
ここで登場するのが、フォームに備わっている `TimerInterval` プロパティです。
これは、「指定したミリ秒(1000分の1秒)ごとに、フォームの `Timer` イベントを自動的に発生させる」という機能です。
イメージとしては、目覚まし時計をセットしておくようなものです。
1. メインの作業(または待機状態)をしている最中も、バックグラウンドでタイマーがコツコツと時を刻む。
2. 設定した時間が来ると、Accessが「おっ、時間だよ!」とメインの動きをちょっとだけ中断して、`Form_Timer()` イベントに書かれたコードを実行する。
3. 処理が終わると、何食わぬ顔で元の状態に戻る。
これを利用すれば、「画面をフリーズさせずに、一定間隔で裏で別の仕事をさせる」という擬似マルチスレッド環境が作れるのです。
—
2. 実践!TimerIntervalで「なんちゃってマルチスレッド」を実装する
百聞は一見に如かず。実際に手を動かして、その動きを体感してみましょう。
今回は、「ボタンを押して重い処理(のフリ)をしている間も、裏でタイマーが動き続けて時計やステータスを更新し続けるシステム」を作ります。
手順1:フォームの準備
1. 適当な空のフォームをデザインビューで開きます。
2. 以下のコントロールを配置してください。
- テキストボックス(名前:`txtClock`)…… 現在時刻を表示(タイマーで動く)
- テキストボックス(名前:`txtStatus`)…… 処理の進捗を表示
- コマンドボタン(名前:`btnHeavyTask`)…… 重い処理を実行するボタン
手順2:VBAコードの記述
フォームのコードモジュールを開き、以下のコードをそのまま貼り付けてみてください。
Option Explicit
‘ 処理中フラグ(多重実行を防ぐためのガードマン)
Private isProcessing As Boolean
‘ フォームを開いたときの初期設定
Private Sub Form_Load()
‘ 初期化
isProcessing = False
txtStatus.Value = “待機中…”
‘ 【超重要】タイマーの間隔をミリ秒で設定する
‘ 1000ミリ秒 = 1秒に1回、Timerイベントを発生させる
Me.TimerInterval = 1000
MsgBox “フォームの準備ができました。「重い処理を実行」ボタンを押してみてください。”, vbInformation
End Sub
‘ 【タイマーイベント】 TimerIntervalで指定した時間ごとに自動で呼ばれる
Private Sub Form_Timer()
‘ 現在時刻を常時更新する(これが裏で動くバックグラウンド処理のイメージ)
txtClock.Value = Format(Now, “yyyy/mm/dd HH:nn:ss”)
‘ もし裏で重い処理が走っている最中なら、ここで追加の監視や描画更新もできる
If isProcessing = True Then
‘ 例:プログレスドットを動かすなど
Static dotCount As Integer
dotCount = (dotCount + 1) Mod 4
txtStatus.Value = “バックグラウンド処理中” & String(dotCount, “.”)
End If
End Sub
‘ 【ボタンクリック】あえて重い処理をシミュレートする
Private Sub btnHeavyTask_Click()
Dim i As Long
‘ 多重実行の防止
If isProcessing = True Then Exit Sub
isProcessing = True
txtStatus.Value = “重い処理を開始します…”
‘ あえて数秒間フリーズするような重いループ処理を再現
For i = 1 to 5
‘ VBAのDoEvents関数が、画面の描画やタイマーイベントの割り込みを許す最大のミソ!
DoEvents
‘ 1秒スリープ(擬似的な重い処理)
Call Sleep(1000) ‘ ※環境によってはAPI宣言が必要ですが、今回は簡易的にループで代用
Next i
‘ 簡易的なウェイトの代わりに、実際はこんなループを回すことも多いです
Dim startTime As Double
startTime = Timer
Do While Timer < startTime + 5
DoEvents ' ←これが無いとタイマーイベントも止まってしまいます!
Loop
' 処理終了
isProcessing = False
txtStatus.Value = "処理が完了しました!"
MsgBox "重い処理が終わりました。時計はずっと動き続けていましたよね?", vbInformation
End Sub
---
3. ここがエンジニアの知見!コードの急所と「陥りやすい罠」
上記のコードで、最も重要なキーワードに気づきましたか?
そう、`DoEvents` という関数です。
罠その1:`DoEvents` を忘れると、タイマーも死ぬ
初心者が一番ハマる罠がこれです。
`TimerInterval` を設定していても、VBAが何万件ものループ処理に没頭している最中は、原則として他のイベント(Timerイベント含む)を受け付けません。
そこでループの中に `DoEvents` を挟むことで、Accessに対してこう伝えます:
> 「ねえ、ずっと計算しなくていいから、ちょっと一瞬だけ手の動きを止めて、Windowsからのメッセージ(タイマー発動や画面の再描画など)を処理してきてよ!」
この `DoEvents` を制する者が、AccessのUI制御を制すると言っても過言ではありません。
罠その2:タイマー間隔(TimerInterval)を短くしすぎるな
「1ミリ秒ごとにバリバリ監視させたい!」というロマンを持つ人がいますが、これは厳禁です。
Access(VBA)はデスクトップアプリの簡易的な言語です。あまりに短い間隔(例えば 10ms など)でタイマーを回すと、バックグラウンド処理がメインスレッドを圧迫し、逆にアプリ全体がカクカクになったり、最悪の場合は強制終了(クラッシュ)を引き起こします。
実用的なバックグラウンド監視であれば、`1000`(1秒) または `5000`(5秒) 程度が、人間にとってもPCにとっても一番優しいバランスです。
罠その3:エラーハンドリングの欠如による「タイマーの暴走」
Timerイベント内でエラーが発生すると、ユーザーが意図しないタイミングでエラーメッセージボックスがポップアップし続け、フォームが操作不能になるという恐怖の現象が起きます。
タイマー内のコードには、必ず以下のような堅牢なエラー対策(ErrH)を仕込むのがプロの流儀です。
Private Sub Form_Timer()
On Error GoTo ErrorHandler
‘ — ここに実際のタイマー処理を書く —
Exit Sub
ErrorHandler:
‘ タイマー内でエラーが出ても、アプリ全体が死なないようにログに残して静かにスルーするか、フラグを折る
‘ MsgBox “タイマー処理でエラー: ” & Err.Description ‘ 連打されるのでメッセージボックスは非推奨
Me.TimerInterval = 0 ‘ 一旦タイマーを止める安全策
End Sub
—
まとめ
いかがだったでしょうか?
フォームの `TimerInterval` を使いこなし、`DoEvents` と組み合わせることで、Access VBAでもまるで裏で別の仕事が動いているかのようなリッチな挙動を実現できます。
- 一定間隔の処理には `TimerInterval`(ミリ秒単位)を使う
- 重い処理の中でも `DoEvents` を挟むことで、タイマーや画面を生かす
- 間隔を短くしすぎず、エラー対策(暴走防止)を必ず入れる
ここをクリアすれば、もう「マクロの記録を貼り付けるだけの人」ではありません。あなたは立派な「Accessアプリの設計者」です。
日々の業務システム開発に、ぜひこの「タイマー活用術」を取り入れて、まわりの同僚をあっと言わせるスマートなツールを作ってみてくださいね。応援しています!
