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

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

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

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

  1. ' 参照状態をメッセージボックスで表示  
  2. Public Function CheckReferences()  
  3.     Dim Ref  
  4.     Dim Msg As String  
  5.       
  6.     For Each Ref In References  
  7.         Msg = Msg & Ref.Name & " (" & Ref.Major & "." & Ref.Minor & ") " & " = " & (Not Ref.IsBroken) & vbCrLf  
  8.         If Not Ref.IsBroken Then  
  9.             Msg = Msg & Ref.Guid & vbCrLf  
  10.             Msg = Msg & Ref.FullPath & vbCrLf  
  11.         End If  
  12.         Msg = Msg & vbCrLf  
  13.     Next Ref  
  14.       
  15.     MsgBox Msg  
  16. End Function  

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

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

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

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

コメント