こんにちは、なかぜんです。
「処理中に画面が固まる…」「重たい処理を裏でこっそり進めたい…」そんな悩み、Accessを使った業務システムでよく耳にします。
今回は、そんな悩みを解決するために、VBAで非同期処理を実現するテクニックをご紹介します。処理中も画面を操作できるようになると、ユーザー体験もぐっと向上しますよ。
非同期処理とは?
非同期処理とは、「メインの処理とは別に、並行して動く処理」のことです。たとえば、重たいデータ出力や外部システム連携などの間にも画面操作を続けられるようになります。
ただし、VBAにはネイティブなマルチスレッド機能はありません。そのため、疑似的な非同期処理を工夫して実現する必要があります。
VBAでできる非同期処理の主な方法
① DoEventsで画面の応答を確保する
DoEvents
はVBAにおいて、最も簡単に“疑似的な非同期”を実現する方法です。
Sub 長い処理()
Dim i As Long
For i = 1 To 100000
' 時間のかかる処理
DoEvents ' 応答を返す
Next i
MsgBox "完了!"
End Sub
解説:
ループ中にDoEvents
を挟むことで、Windowsメッセージキューが処理され、フォームやボタンの操作が可能になります。
② Shell関数で処理を分離
重たい処理を別のAccessファイルやVBScriptに外出しすることで、“別プロセス”として並列実行できます。
Sub 非同期開始()
Dim path As String
path = "C:\Temp\HeavyProcess.accdb"
Shell "msaccess.exe """ & path & """", vbNormalFocus
End Sub
解説:
Shell関数で別ファイルを実行すれば、親Accessは固まることなく動き続けます。終了検出や連携には、ファイルベースのフラグやステータス管理が必要です。
③ タイマー処理を使って段階的に処理を分割
1つの大きな処理を分割して、Form_Timer
イベントで順次進める方法です。
Private Sub Form_Timer()
Static StepIndex As Integer
Select Case StepIndex
Case 0
' Step 1
Case 1
' Step 2
Case 2
Me.TimerInterval = 0
MsgBox "処理完了"
End Select
StepIndex = StepIndex + 1
End Sub
解説:
フォームにTimerInterval
(単位:ミリ秒)を設定し、分割した処理を1つずつ呼び出すことで画面応答を保ちます。
注意点とよくあるミス
- DoEventsの使いすぎは禁物:過度な使用はパフォーマンスを落とします。必要最小限に。
- Shell実行の同期確認が難しい:処理完了をどう検知するか設計段階で工夫が必要です(ログファイルやフラグファイルなど)。
- Timerはメモリリークに注意:処理完了後に必ず
Me.TimerInterval = 0
で止めましょう。
応用:非同期処理 × ユーザー体験の向上
非同期処理は、ユーザーのストレス軽減だけでなく、UI設計にも大きなメリットをもたらします。
- 進捗バーの表示:処理ステップに応じてラベルやバーを更新
- キャンセルボタンの有効化:処理を途中キャンセルできるように設計
- ログ出力との併用:ステップ単位の処理進行ログを残すことで保守性UP
業務システムで使えば、重たい出力処理やデータ分析処理でも“固まらないAccess”が実現できます!
まとめ:非同期処理で業務効率をUPしよう
今回は、VBAでできる非同期処理のテクニックを3つご紹介しました。
- DoEventsでの簡易非同期
- Shell関数による外部実行
- Timerイベントによる段階処理
Accessは非同期が苦手と思われがちですが、少しの工夫で十分に「固まらない」仕組みが作れます。
次のステップとしては、
- フォーム操作と非同期の組み合わせ
- エラーハンドリングを組み込んだ堅牢な非同期処理
- 業務システム全体に応用する
といった方向にも発展できます。
今回の記事が、あなたのAccess業務システムに役立つヒントになれば嬉しいです!
ではまた、なかぜんでした。
