Access Runtime 実行時エラーでアプリケーションが強制終了

Access Runtime を利用してハマったメモ

実行時のエラーと状況
  • Access Runtime でのみエラー発生
  • マクロ AUTOEXEC の実行でも発生
  • フォームのOpenイベントでも発生
  • コードの実行時エラーをトラップしようとしても、それ以前で発生している様子 ←重要
チェック項目
  • 参照設定
  • Access 64bit で Windows API 呼び出し宣言 ←今回の原因

参照設定の確認
下記の関数を埋め込んだ accdb や mdb を作成して、参照設定を問題のあるファイルと同じに設定
マクロ Autoexec にプロシージャの実行で起動時に CheckReferences() を実行させる

' 参照状態をメッセージボックスで表示
Public Function CheckReferences()
    Dim Ref
    Dim Msg As String
    
    For Each Ref In References
        Msg = Msg & Ref.Name & " (" & Ref.Major & "." & Ref.Minor & ") " & " = " & (Not Ref.IsBroken) & vbCrLf
        If Not Ref.IsBroken Then
            Msg = Msg & Ref.Guid & vbCrLf
            Msg = Msg & Ref.FullPath & vbCrLf
        End If
        Msg = Msg & vbCrLf
    Next Ref
    
    MsgBox Msg
End Function

こんな感じに、情報が取得できる

Access 64bit で Windows API 呼び出し宣言を確認
VBA画面から検索でプロジェクト内に API呼び出しのため Declare 宣言が存在していないか確認

Declareは、マクロを含むVBAコードが最初に呼ばれたときに処理されるらしく、全くコードを呼び出さない状態にすると強制終了は免れますが、コードを実行しようとした途端に強制終了となります
コード実行以外においても、リスト(データソース)のクエリ内にVBA関数が埋め込まれており、それが最初に呼び出される場合、全く関係ないVBA関数をコンパイル エラーとして上げてくる場合があります

対応は 64 ビット Visual Basic for Applications の概要 で説明されているように 32bit, 64bit 両方で Declare を動作させるには Vba7 や Win64 コンパイラスイッチを利用して、環境によるコードの切り替えが必要になります

コメント