2016-09-05 6 views
3

Я пытаюсь вызвать функцию из DLL из VBA в Excel.Устранение неполадок вызова функции DLL из Excel Vba

My Excel 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 

Теперь, когда я называю ее из ячейки Excel с чем-то вроде "= TestDll (3.0)", он не работает. Я вижу строку «Начать» в непосредственном окне, но ничего больше. Это похоже на то, что ошибка происходит именно тогда, когда вызывается «TestFunction1». Excel отображает «#VALUE!» в ячейке.

Я также могу установить точку останова в отладчике, но когда я дойду до вызова TestFunction1, он просто закончится. Я не могу найти сообщение об ошибке.

Мой вопрос: как мне отладить это? Я не получаю сообщение об ошибке. Это просто не работает. Как я могу понять, что происходит не так?

+0

Почему я получаю downvoted? Я действительно борюсь с этой проблемой, и я сначала попытался ее исследовать. Я просто не могу понять, куда идти. – carrie88

+0

Вы никогда не назначаете значение 'r'. И вы никогда не объявляете 'ret' как Double. (Не уверен, что эти проблемы вызывают, но я предлагаю вам исправить их в любом случае.) – YowE3K

+3

Вы можете попробовать добавить DLL-файл в ссылки на проект VBA и F2 для поиска метода в Проводнике объектов. Еще одна вещь, которую вы можете попробовать, - использовать 'As Object' вместо' As Double'. Я не думаю, что мы можем вам помочь, без какой-либо информации о '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

Это хороший совет относительно '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' Однако корень проблемы, по-видимому, связан с вызовом TestFunction1: * когда я добираюсь до вызова TestFunction1, он просто заканчивается *. –

+0

Спасибо за ваш ответ. Когда я запускаю в отладчике, выполнение не проходит мимо «r = TestFunction1 (k)». – carrie88

+0

см. Редактирование на мой ответ. Это поможет вам уловить реальную ошибку. Вывести сообщение об ошибке и номер ошибки. Может быть, кто-то сможет помочь. – teddy2