Q. アドインが読み込まれるたびに、Excel が次のエラーをスローし続けます (ランタイム エラー 49、不適切な DLL 呼び出し規約)。
外部DLL参照がまったくないにもかかわらず、エラーがどこにあるかを示すことなく、ダイアログが毎回ポップアップし始めます。
また
Q. 特定のコード行を保存するたびに Excel がクラッシュします。
これはどのように修正できますか?
このエラーは、コンパイラのバグが原因で発生している可能性があります。これに対する最も簡単な解決策は、コードを少し変更して再コンパイルすることです。私が通常行っていることは、
1 -> アドインPrivate Enum
の任意のモジュールの先頭にタイプを追加します
Private Enum Something
member = 1
End Enum
2 ->アドインをコンパイルする
3 -> エクセルを再起動
4 -> コードの変更を削除します。もう必要ありません。
このエラーは外部 (DLL) 関数呼び出しを参照していますが、VBA 定義の関数またはサブルーチンのパラメーターまたは戻り値の型の不一致によってトリガーされる可能性があります。さらに、これらの原因によってトリガーされた場合、デバッガーはエラー ポイントを別の関数呼び出しとして表示することがあります。これは、多くの場合、問題が発生するまで動作していて安定していた呼び出しを含む、呼び出しスタックの上位にあります。多くの場合、この問題は、固定型のパラメーター引数または戻り値と Variant の間の不一致、またはその逆によって引き起こされます。
例: Variant 値関数は、実行時に整数変数に割り当てられた Long 値を返します。
解像度:
オブジェクト メソッド (AutoFit など) が、そのメソッドを使用できない誤ったオブジェクト バリエーションに適用された (行全体でも列範囲全体でもない範囲に適用されている AutoFit など)。上記のシナリオと同様に、エラーは、ステートメント自体ではなく、問題のあるステートメントが存在するルーチンのリターン ポイントでスローされる場合があります。
解決策: 構文の問題を修正することから始めます。残念ながら、VBE エディターがリセットされるまで、動作するはずの修正がエラーをスローし続けることがあります。その問題を解決するための最小限の手順を推測していませんが、次のようなものがよく機能します。
外部ライブラリ関数の呼び出しが原因であると特定された場合は、エラーに関する Microsoft のドキュメントを参照してください。
不適切な DLL 呼び出し規約
*ダイナミック リンク ライブラリ (DLL) に渡される引数は、ルーチンが期待するものと正確に一致する必要があります。呼び出し規約は、引数の数、型、および順序を扱います。プログラムが、間違った型または数の引数を渡された DLL 内のルーチンを呼び出している可能性があります。
このエラーを修正するには、すべての引数の型が、呼び出しているルーチンの宣言で指定されたものと一致していることを確認してください。
呼び出しているルーチンの宣言に示されているのと同じ数の引数を渡していることを確認してください。
DLL ルーチンが値渡しの引数を想定している場合は、ルーチンの宣言でこれらの引数に ByVal が指定されていることを確認してください。
戻り引数: プロシージャーの引数について話すときに見過ごされやすいものの 1 つに、戻り引数があります。正しいタイプであること、または欠落していないことを確認してください。Excel/VBA ユーザーは、関数の戻り値の型を省略すると、システムが暗黙的に戻り値の型を Variant に設定し、返されたデータを処理することに慣れています。外部宣言された関数ではそうではありません!! 戻り値の型は、DECLARE ステートメントで宣言する必要があります。*
破損したライブラリ参照: モジュール コードのライブラリ参照が有効かどうかを確認します。VBA IDE で、[ ツール] => [参照] を選択して、参照されているライブラリのリストを表示し、チェックされている項目のいずれにも「欠落」とマークされていないことを確認します。もしそうなら、それらを修正してください。
または、これまでで最高のオプション:
- ルーチンの名前を書き直してください。
- その後、再コンパイルしてください。
これで準備完了です。
参考までに、正常に実行されていた Excel VBA コードで"Runtime Error 49, Bad DLL Calling Convention"も経験しました。
エラーは内部関数呼び出しを指していました。私にとっての修正は、引数を ByVal から ByRef に変更することでした。その値が既に ByRef に渡されている別の関数への呼び出しが存在したため、これが要因であった可能性があります。