3 votes

Dépannage de l'appel de fonction DLL depuis Excel VBA

Je suis en train d'essayer d'appeler une fonction depuis une DLL en VBA dans Excel.

Mon macro VBA Excel ressemble à ceci:

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

Maintenant, lorsque je l'appelle depuis une cellule Excel avec quelque chose comme "=TestDll(3.0)", ça ne fonctionne pas. Je vois la chaîne "Start" dans la fenêtre immédiate, mais rien d'autre. C'est comme si une erreur se produisait exactement lorsque "TestFunction1" est appelée. Excel affiche "#VALUE!" dans la cellule.

Je peux également définir un point d'arrêt dans le débogueur, mais lorsque j'arrive à l'appel de TestFunction1, ça se termine simplement. Il n'y a aucun type de message d'erreur que je puisse trouver.

Ma question est, comment puis-je déboguer cela? Je ne reçois aucun message d'erreur. Ça ne fonctionne tout simplement pas. Comment puis-je comprendre ce qui ne va pas?

3voto

teddy2 Points 329

La variable que vous utilisez dans l'instruction de débogage contient une erreur et donc la fonction UDF échoue. Le reste est correct. En fait, vous devez convertir r en chaîne ou utiliser & pour la concaténation dans votre instruction de débogage.

Édition : pour inclure un gestionnaire d'erreurs.

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

    Dim r       As Double

    '/ Ajouter un gestionnaire d'erreur
    On Error GoTo errHandler
    '/ En supposant que votre fonction de test retournera 10*paramètre
    r = k * 10

    '/ La variable que vous retournez a une erreur et donc l'UDF échoue.
    '/ Le reste est correct. Ici vous obtiendrez une erreur de type mismatch.
    Debug.Print ("Résultat obtenu de " + r)

    '/ En fait, vous devez le convertir en chaîne de caractères ou utiliser `&` pour la concaténation
    Debug.Print ("Résultat obtenu de " + CStr(r))

    '/ ou
    Debug.Print ("Résultat obtenu de " & r)

    Debug.Print ("Terminé")

    TestDll = r

errHandler:
    If Err.Number <> 0 Then
        '/ Erreur capturée et vous obtenez la description et le numéro d'erreur réels.
        MsgBox Err.Description, vbCritical, Err.Number
    End If

End Function

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X