2016-09-05 19 views
3

ExcelのVBAから関数をDLLから呼び出そうとしています。このようなExcel VBAからのDLL関数呼び出しのトラブルシューティング

マイエクセルVBAマクロルックス:

Declare PtrSafe Function TestFunction1 Lib "mylib.dll" (ByVal k As Double) As Double 

Public Function TestDll(k As Double) As Double 
    Debug.Print ("Start") 

    Dim r As Double 
    r = TestFunction1(k) 

    Debug.Print ("Got result of " + r) 
    Debug.Print ("Done") 

    TestDll = r 
End Function 

私は "= TestDll(3.0)" のようなものでExcelのセルからそれを呼び出したとき、それは動作しません。私は、直接のウィンドウに "Start"という文字列を表示しますが、それ以外は表示されません。 「TestFunction1」が呼び出されているときにエラーが発生しているようです。 Excelに「#VALUE」と表示されます。細胞内で

デバッガでブレークポイントを設定することもできますが、TestFunction1呼び出しに到達すると終了します。私が見つけることができるエラーメッセージの種類はありません。

私の質問は、これをどのようにデバッグするのですか?エラーメッセージは表示されません。単に機能しません。どうやって間違っているのか分かりますか?

+0

なぜ私はdownvotedになっていますか?私はこの問題を本当に苦労しています。私は最初にそれを研究しようとしました。私はどこに行くのか分からない。 – carrie88

+0

あなたは決して 'r'に値を割り当てません。そしてあなたは決してダブルとして 'ret'を宣言していません。 (それらがあなたの問題を引き起こしているかどうかは確かではありませんが、とにかく解決することをお勧めします) – YowE3K

+3

VBAプロジェクト参照に.dllファイルを追加し、オブジェクトエクスプローラでメソッドを検索するためにF2を試すことができます。あなたが試みることができる別のものは 'As Double'の代わりに' As Object'を使うことです。私は 'mylib.dll'と' TestFunction1'についての情報がなくてもあなたを助けることはできないと思っています – Slai

答えて

3

デバッグ文で使用している変数にエラーがあり、UDFが失敗します。 安心です。実際にはrを文字列に変換するか、デバッグステートメントで連結するために&を使用する必要があります。

編集:エラーハンドラを含める。

Public Function TestDll(k As Double) As Double 
    Debug.Print ("Start") 

    Dim r  As Double 

    '/ Add a error handler 
    On Error GoTo errHandler 
    '/ Assuming that your testfunction will return 10*parameter 
    r = k * 10 


    '/ The variable which you are returning,has a error and hence the UDF fails. 
    '/ Rest is fine. Here you will get type mismatch error. 
    Debug.Print ("Got result of " + r) 

    '/ Actually you need to convert it to string or use `&` for concatenation 
    Debug.Print ("Got result of " + CStr(r)) 

    '/ or 
    Debug.Print ("Got result of " & r) 


    Debug.Print ("Done") 

    TestDll = r 

errHandler: 
    If Err.Number <> 0 Then 
     '/ Error trapped and you get actual error desc and number. 
     MsgBox Err.Description, vbCritical, Err.Number 
    End If 

End Function 
+0

これは連結のための '&' vs '+'に関する良いアドバイスです。後者はこの場合に型不一致エラーを生じます。しかし、問題の根源はTestFunction1の呼び出しであるようです。* TestFunction1呼び出しに到達すると、ただ終了します*。 –

+0

あなたの答えをありがとう。デバッガで実行すると、実行は「r = TestFunction1(k)」を過ぎることはありません。 – carrie88

+0

私の答えに編集を参照してください。実際のエラーをトラップするのに役立ちます。エラーメッセージとエラー番号を記入してください。いくつかの人が手伝ってくれるかもしれません。 – teddy2

関連する問題