スポンサーリンク

Accessでのエラーハンドリング大全|業務を止めない堅牢設計をめざそう

スポンサーリンク
Access
スポンサーリンク

こんにちは、なかぜんです。

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通知)」などもおすすめです。

それでは、また次の記事でお会いしましょう!
なかぜんでした。