こんにちは、なかぜんです。
AccessでVBAを組んでいると、こんなお悩みにぶつかったことはありませんか?
- ユーザー操作ミスでフォームが落ちる…
- ネットワークやファイルアクセスで突然エラーが発生
- 「デバッグ」画面が表示されてユーザーがパニック
こうしたトラブル、実は「エラーハンドリング」をしっかり組み込むことで、かなり防げるんです。 この記事では、AccessのVBAでエラーハンドリングを実装する方法を、基本から応用までわかりやすく解説します。
1. なぜエラーハンドリングが必要なのか
Accessは小回りの利く開発環境ですが、エラー処理を怠ると「現場で止まる」リスクが高くなります。 特に、社内業務で使われるツールでは、想定外の操作や予期しないデータによるエラーが日常茶飯事。
そこで登場するのが「エラーハンドリング」。 正しく使えば、ユーザーへの丁寧な案内とログによる原因の追跡が可能になります。
2. 基本のエラーハンドリング構文
◆ On Error文の基本
Sub SampleProcedure()
On Error GoTo ErrorHandler
' メイン処理
Dim x As Integer
x = 10 / 0 ' エラー発生(ゼロ除算)
Exit Sub
ErrorHandler:
MsgBox "エラーが発生しました:" & Err.Description, vbExclamation
' ログ記録などをここで実装
End Sub
この構文では、エラーが発生するとErrorHandler:
のラベルにジャンプし、エラーメッセージを表示します。 終了前にはExit Sub
を入れて、正常終了時にErrorHandlerへ進まないようにするのがポイントです。
◆ Resume Next との使い分け
On Error Resume Next
この命令はエラーを無視して次の行へ進めるもの。 一時的なファイルロックなど、無視しても致命的でない処理に向いています。
3. よく使う応用パターン
◆ エラーログをファイルに出力する
Sub WriteErrorLog(ErrMsg As String)
Dim logFile As String
logFile = CurrentProject.Path & "\error_log.txt"
Dim f As Integer
f = FreeFile()
Open logFile For Append As #f
Print #f, Now & " - " & ErrMsg
Close #f
End Sub
エラーハンドラ内からこの関数を呼び出せば、後からエラー内容を追跡できます。
◆ すべてのフォームに共通処理を仕込む
たとえば各フォームに以下のような初期化プロシージャを追加します:
Private Sub Form_Load()
On Error GoTo ErrHandler
' フォーム初期化処理…
Exit Sub
ErrHandler:
MsgBox "初期処理でエラー:" & Err.Description
Call WriteErrorLog("Form_Load:" & Err.Description)
End Sub
4. 注意点とよくあるミス
- Resume文の使い方ミス:Resumeだけ、Resume Next、Resume [ラベル] の違いを理解する
- On Errorを解除し忘れる:別のプロシージャに影響しないよう、終了時は明示的にリセットを
- Exit Subを忘れる:正常時でもErrorHandlerが実行されてしまう
' 正しく解除する例
On Error GoTo 0
処理終了時に上記のようにリセットしておくと、予期せぬ動作を防げます。
5. 現場で役立つ応用ポイント
◆ モジュール化して再利用しやすく
エラーハンドラやログ処理は、共通モジュールにまとめておくと管理がしやすくなります。
' mod_ErrorHandling モジュール
Public Sub HandleError(ByVal source As String)
MsgBox "エラーが発生しました:" & Err.Description, vbCritical
Call WriteErrorLog(source & " - " & Err.Description)
End Sub
これを各プロシージャで呼び出す形にすると、保守性がぐっと向上します。
Sub SomeTask()
On Error GoTo ErrHandler
' 本処理…
Exit Sub
ErrHandler:
HandleError "SomeTask"
End Sub
6. まとめ|堅牢なVBA設計への第一歩
AccessでのVBAエラーハンドリングを極めることで、業務停止を防ぎ、ユーザーの信頼を得る設計が可能になります。
今回のポイントを振り返ると…
- On Error GoToとResumeの使い分け
- ログ出力の実装
- 共通化による保守性アップ
もしまだプロジェクトに取り入れていなかったら、ぜひ今日から試してみてくださいね。 次のステップとしては、「エラーメッセージの多言語対応」や「管理者だけに通知する仕組み(例:Teams通知)」などもおすすめです。
それでは、また次の記事でお会いしましょう!
なかぜんでした。
