12

Q. アドインが読み込まれるたびに、Excel が次のエラーをスローし続けます (ランタイム エラー 49、不適切な DLL 呼び出し規約)。

エラー

外部DLL参照がまったくないにもかかわらず、エラーがどこにあるかを示すことなく、ダイアログが毎回ポップアップし始めます。

また

Q. 特定のコード行を保存するたびに Excel がクラッシュします。

これはどのように修正できますか?

4

9 に答える 9

18

このエラーは、コンパイラのバグが原因で発生している可能性があります。これに対する最も簡単な解決策は、コードを少し変更して再コンパイルすることです。私が通常行っていることは、

1 -> アドインPrivate Enumの任意のモジュールの先頭にタイプを追加します

Private Enum Something
    member = 1
End Enum

2 ->アドインをコンパイルする

3 -> エクセルを再起動

4 -> コードの変更を削除します。もう必要ありません。

于 2013-04-02T07:49:54.693 に答える
9
  1. このエラーは外部 (DLL) 関数呼び出しを参照していますが、VBA 定義の関数またはサブルーチンのパラメーターまたは戻り値の型の不一致によってトリガーされる可能性があります。さらに、これらの原因によってトリガーされた場合、デバッガーはエラー ポイントを別の関数呼び出しとして表示することがあります。これは、多くの場合、問題が発生するまで動作していて安定していた呼び出しを含む、呼び出しスタックの上位にあります。多くの場合、この問題は、固定型のパラメーター引数または戻り値と Variant の間の不一致、またはその逆によって引き起こされます。

    例: Variant 値関数は、実行時に整数変数に割り当てられた Long 値を返します。

    解像度:

    • 特に最近作業しているルーチンについては、すべてのパラメーター引数と戻り値の型、および代入ステートメントを注意深く確認してください。Variant 値の関数がある場合は、割り当ての正しい型に明示的に型キャストします。
    • Application.Run メソッドを使用して別のワークブック (パラメーター定義を制御できない) のルーチンを呼び出すために上記の状況が避けられない場合、Application.Run メソッドがすべての引数 ByVal を渡す結果として、含まれているルーチンが Sub の場合は、戻り値の型が指定されていない Function に変換してみてください。これにより、スタックのクリーンアップが強制され、呼び出しスタックの上位レベルでスローされるエラー状態が抑制されるようです。
  2. オブジェクト メソッド (AutoFit など) が、そのメソッドを使用できない誤ったオブジェクト バリエーションに適用された (行全体でも列範囲全体でもない範囲に適用されている AutoFit など)。上記のシナリオと同様に、エラーは、ステートメント自体ではなく、問題のあるステートメントが存在するルーチンのリターン ポイントでスローされる場合があります。

    解決策: 構文の問題を修正することから始めます。残念ながら、VBE エディターがリセットされるまで、動作するはずの修正がエラーをスローし続けることがあります。その問題を解決するための最小限の手順を推測していませんが、次のようなものがよく機能します。

    • プロジェクトを明示的に再コンパイルします。
    • ファイルを保存して閉じます。
    • ファイルを再度開き、コードを再実行します。
  3. 外部ライブラリ関数の呼び出しが原因であると特定された場合は、エラーに関する Microsoft のドキュメントを参照してください。

    不適切な DLL 呼び出し規約

    *ダイナミック リンク ライブラリ (DLL) に渡される引数は、ルーチンが期待するものと正確に一致する必要があります。呼び出し規約は、引数の数、型、および順序を扱います。プログラムが、間違った型または数の引数を渡された DLL 内のルーチンを呼び出している可能性があります。

    このエラーを修正するには、すべての引数の型が、呼び出しているルーチンの宣言で指定されたものと一致していることを確認してください。

    呼び出しているルーチンの宣言に示されているのと同じ数の引数を渡していることを確認してください。

    DLL ルーチンが値渡しの引数を想定している場合は、ルーチンの宣言でこれらの引数に ByVal が指定されていることを確認してください。

    戻り引数: プロシージャーの引数について話すときに見過ごされやすいものの 1 つに、戻り引数があります。正しいタイプであること、または欠落していないことを確認してください。Excel/VBA ユーザーは、関数の戻り値の型を省略すると、システムが暗黙的に戻り値の型を Variant に設定し、返されたデータを処理することに慣れています。外部宣言された関数ではそうではありません!! 戻り値の型は、DECLARE ステートメントで宣言する必要があります。*

  4. 破損したライブラリ参照: モジュール コードのライブラリ参照が有効かどうかを確認します。VBA IDE で、[ ツール] => [参照] を選択して、参照されているライブラリのリストを表示し、チェックされている項目のいずれにも「欠落」とマークされていないことを確認します。もしそうなら、それらを修正してください。

于 2014-09-20T00:15:29.470 に答える
7

または、これまでで最高のオプション:

- ルーチンの名前を書き直してください。

- その後、再コンパイルしてください。

これで準備完了です。

于 2016-04-19T13:42:07.273 に答える
2

参考までに、正常に実行されていた Excel VBA コードで"Runtime Error 49, Bad DLL Calling Convention"も経験しました。

エラーは内部関数呼び出しを指していました。私にとっての修正は、引数を ByVal から ByRef に変更することでした。その値が既に ByRef に渡されている別の関数への呼び出しが存在したため、これが要因であった可能性があります。

于 2015-06-16T11:22:08.973 に答える