2013-04-02 12 views
7

Q. Excelは、次のエラーを投げ続け、私のアドインがロードされるたびに(ランタイムエラー49、不正なDLL呼び出し規約は)はランタイムエラー49は、不正なDLLの呼び出し規約

Error

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

OR

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

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

答えて

12

このエラーはおそらく、コンパイラのバグのために発生しています。 これに対する最も簡単な解決策は、小さなコード変更を行い、再コンパイルすることです。 >コンパイルアドイン

3 - - >再起動>アドイン

Private Enum Something 
    member = 1 
End Enum 

2に任意のモジュールの先頭にPrivate Enumタイプを追加 - は

1が、私は通常、何をすべきかexcel

4 - >変更されたコードを削除します。もはや必要ではありません。

+0

おもしろいです!ただ好奇心から:質問と回答を同時に投稿する方法は?答えを "あらかじめ書いて"いましたか? –

+1

@PeterAlbert質問を投稿するときにチェックボックスがあります。[自分自身で答える](http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-自分の質問/)。 –

+4

私は以下のショートカットを使用します: 'Ctrl + A' - ' Ctrl + X' - 'Ctrl + V' - ' Ald + D' - 'L' – stenci

6
  1. このエラーは、外部(DLL)関数呼び出しを指していても、それ は、パラメータによってトリガされ得るか、または戻り値 VBA定義関数またはサブルーチンのタイプの不一致。さらに、 がこれらの原因によってトリガされた場合、デバッガではエラー が表示されることがあります。多くの場合、 コールスタックでは、機能しています。作成した。多くの場合、問題は 固定タイプのパラメータ引数または戻り値と バリアントの間のミスマッチ(またはその逆)によってトリガされます。

    例:バリアント値関数は、整数変数に割り当てられ、実行時に long値を返します。

    解像度

    • 慎重にすべてのパラメータの引数をチェックして、特にあなたが最近に取り組んできた ルーチンに対して、 値の型と代入文を返します。バリアント値関数がある場合は、 割り当てのための正しい型に明示的に型キャストします。上記の状況は、すべての引数を渡すApplication.Runメソッドの結果として、原因別のワークブック(そのためには、パラメータの定義を制御することはできません)でルーチンを呼び出すためにApplication.Runメソッドを使用して避けられない場合
    • ByValの場合、包含ルーチンがSubの場合、指定された戻り値の型のない関数に変換してみてください。これは、スタックのクリーンアップを強制し、コールスタックの上位レベルでスローされるエラー状態を抑制します。
  2. (例えば自動調整のような)オブジェクトメソッドは、その方法は、(例えば自動調整 が行全体又は全体 列範囲でもない範囲に適用されるとして利用できないため、誤ったオブジェクトの変形に適用されます)。上記のシナリオと同様に、エラーは であり、ステートメント自体ではなく ステートメントが存在するルーチンのリターンポイントでスローされる可能性があります。

    解決方法: 構文の問題を修正して開始してください。 VBEエディタがリセットされるまで、残念ながら がエラーをスローする場合があります。私はその問題を解決する手順の最小セットを推定していない が、このような 何かが頻繁に動作します:

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

    不正なDLLの呼び出し規約引数に渡された*

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

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

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

    DLLルーチンが値で引数を必要とする場合は、ルーチンの宣言の引数にByValが であることを確認してください。

    戻り値 手続き引数について語っている が戻り値であるときに、簡単に見落とされることが1つあります。正しいタイプの を確認してください。 Excel/VBAユーザー は、 関数の戻り値の型を省略すると、システムは暗黙的に戻り値の型をVariantとし、返されるデータでは を使用するという事実に使用されます。そうでないと、外部で宣言された 機能!戻り値の型は、DECLARE ステートメントで宣言する必要があります。*

  4. 壊れたライブラリ参照:モジュールコードのライブラリ参照が有効かどうかを確認してください。VBA IDEで ツール=>参照を選択し、参照されるライブラリの一覧を表示し、 にチェックされた項目のいずれも "がありません"とマークされていないことを確認してください。その場合は、 を修正してください。

2

は情報については、私はまた、罰金を実行していたExcelのVBAコードで「ランタイムエラー49、不正なDLL呼び出し規約」を経験しました。

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

0

もう1つの考えられる原因を追加するには、Application.OnTimeメソッドを使用して、パラメータを使用してパブリックサブを呼び出す必要がありました。パラメータは長い(現在の行)が意図されていますが、実際には文字列値として渡されていると思います。ここで

はのOnTimeコールの例です:

Application.OnTime Now + TimeValue("00:00:01"), "'UpdateEditedPref " & curRow & "'" 

私は、コードや再コンパイルに任意の更新を実行しようとしたが、これは問題を解決しませんでした。それは何と呼ばれるサブの文字列に長いから、パラメータの種類を変えた固定:

Public Sub UpdateEditedPref(ByVal inRowStr As String) 

は次に、あなただけのサブ内の値に文字列を変換する必要があります。ありがたいことに、それ以上のエラーはありません。

更新:Application.OnTimeを使用してパラメータを渡すは、「マクロを実行することはできません」、別のエラーの原因となっているようです。ワークシートがロックされたときにこのエラーが発生しました。私はまだApplication.OnTimeを使用していますが、パラメータを渡す代わりに、グローバル変数に値を保存し、その値を被呼び出しサブで使用しています。これは正しく動作しているようです。

のOnTime呼び出しは次のようになります。

' Set global variable 
gCurRow = curRow 

Application.OnTime Now + TimeValue("00:00:01"), "UpdateEditedPref" 
-1

はOOOOOOOR、史上最高のオプション:

- ルーチンの名前を書き換えます。

- その後、再コンパイル!

あなたは今すぐ行けます!

+0

この回答は詳細と詳細に欠けています。私はそれが好きですが、答え自体は欲しいと思っています... – JoeG

+0

JoeG、私はあなたの意見を尊重します。私がもっと詳細を提供できるならば、私はそれを理解することを望んでいます。しかし、問題が発生したときにここに戻ってきて、私が提案した解決策の前にできることをすべて試してください。次に、このソリューションを試してください。それは魅力のように動作します。それは約束です。 トーンについては、それでいいのに感謝します。 –

+0

テストする前に答えに-1をつけると、実際には私は強く反対します。 –

-1

フェルナンドのソリューションは、流れが戻ってメインサブに戻ったとき、私は別のサブとコードを呼び出すメインサブだけで失敗していた...よく私のシナリオでは

を働きました。 もう1つのSub、再コンパイルされたプロジェクトの名前を変更したところ、元のSub名を見つけるのにエラーが発生しました。それから元に戻して、問題なく再コンパイルしました。

そのマクロが実行時エラー49をスローしなかった後...

おかげ

Sysss

+0

答えとしてこのコメントを投稿するのではなく、Fernandoの回答...にコメントしたはずです。それは何も新しいものを提供しない。 – Rdster

+0

はい、それは本当です。 – sysss

関連する問題