Access Runtime 実行時エラーでアプリケーションが強制終了
Access Runtime を利用してハマったメモ
実行時のエラーと状況
参照設定の確認
下記の関数を埋め込んだ accdb や mdb を作成して、参照設定を問題のあるファイルと同じに設定
マクロ Autoexec にプロシージャの実行で起動時に CheckReferences() を実行させる
こんな感じに、情報が取得できる
Access 64bit で Windows API 呼び出し宣言を確認
VBA画面から検索でプロジェクト内に API呼び出しのため Declare 宣言が存在していないか確認
Declareは、マクロを含むVBAコードが最初に呼ばれたときに処理されるらしく、全くコードを呼び出さない状態にすると強制終了は免れますが、コードを実行しようとした途端に強制終了となります
コード実行以外においても、リスト(データソース)のクエリ内にVBA関数が埋め込まれており、それが最初に呼び出される場合、全く関係ないVBA関数をコンパイル エラーとして上げてくる場合があります
対応は 64 ビット Visual Basic for Applications の概要 で説明されているように 32bit, 64bit 両方で Declare を動作させるには Vba7 や Win64 コンパイラスイッチを利用して、環境によるコードの切り替えが必要になります
実行時のエラーと状況
- 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 コンパイラスイッチを利用して、環境によるコードの切り替えが必要になります
コメント