Страницы: 1
RSS
Подключить DLL(C++) к VBA
 
Здравствуйте, создал тестовую DLL с помощью def файла:
Код С++ (*.cpp)
Код
 
double __stdcall square(double & x)
{
   return x * x;
}

Код С++ (*.def)
Код
 
LIBRARY "square"
EXPORT
square

Затем пытаюсь подключить к VBA так:
Код
Declare PtrSafe Function square _
Lib "C:\Users\OSA\source\repos\square\x64\Debug\square.dll" _
(ByRef x As Double) As Double

В ячейке пишу формулу с подключенной функцией "square":
Код
=square(10)
И в ячейке получаю ошибку "ЗНАЧ!"
Использую Excel 2016 x 64. Помогите разобраться где ошибка.
 
Доброе время суток.
Не ваш случай? По позже bedvit подтянется, подскажет как правильно. Он спец.
 
Спасибо Андрей. Сейчас в пути, поэтому посмотреть могу через час. Используйте функцию square в VBA, а не на листе. Вы декларируете в заголовке ее для транслятора VBA. Что бы лист понимал функцию, ее надо обернуть в VBA. Да и библу можно собрать в Relise, в Debug работает медленнее и весит больше.
«Бритва Оккама» или «Принцип Калашникова»?
 
Согласен с Андрей VG и bedvit, не хватает вызова функции. Типа того:
Код
Declare PtrSafe Function square _Lib "C:\Users\OSA\source\repos\square\x64\Debug\square.dll" _
(ByRef x As Double) As Double
'создаем функцию для вызова декларированной в DLL функции
Function CallSQ(x as double)
CallSQ = square(x)
end function
ведь сами по себе функции API не могут быть вызваны с листа.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий Щербаков, все верно, потому как декларация это  ссылка для транслятора VBA. Лист про нее ничего не знает. А на листе вызывать CallSQ.
«Бритва Оккама» или «Принцип Калашникова»?
 
А если собрать .xll, то и декларировать ничего не нужно и VBA не нужен. Правда в этом случае регистрацию все равно надо писать, но в самой библе. Зато пользователю одни плюшки - открыл, пользуйся.
«Бритва Оккама» или «Принцип Калашникова»?
 
Благодарю за уделенное внимание. Собрал dll в Relise,  сделал функцию как посоветовали:
Код
Declare PtrSafe Function square _
Lib "C:\Users\OSA\Desktop\Dll\square\x64\Release\square.dll" _
(ByRef x As Double) As Double

Function CallSQ(x As Double)
CallSQ = square(x)
End Function

В ячейке ввел:
Код
=CallSQ(10)
Получил ту же ошибку.
Вначале  делал все так же как в  этом видеоролике, у автора видео функция сработала сразу на листе, не понимаю почему у меня не получается. Может быть в 2016 версии Excel нужно что то добавить или поменять в коде?
Изменено: OSA913 - 07.06.2018 14:29:27
 
А Вы пробовали вызывать функцию процедурой?
Код
Sub CallSQ_S(x As Double)
msgbox square(x)
End sub
ошибок не появляется, все работает? Может сборку произвели для 64 бит, а офис 32-битный?
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Попробовал процедурой таким образом:
Код
Sub qq()
CallSQ (5)
End Sub

Получил ошибку 453: "Can't find DLL entry point square in"
офис и виндоус 64й
Изменено: OSA913 - 07.06.2018 14:50:27
 
Вероятно, DLL-ку надо регистрировать в системе.
Хотя туплю, судя по ошибке функция неверно декларирована в коде. Т.е. система не видит эту функцию. Проверьте написание везде, что ли...Пока только так видится проблема.
Изменено: Дмитрий Щербаков - 07.06.2018 14:53:26
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Нет, регистрировать не нужно. Вы в какой разрядности собираете? должна быть разрядность такая же как Excel.
«Бритва Оккама» или «Принцип Калашникова»?
 
Попробовал Tools-References-Browse..., выбрал файл длл. выскочило сообщение "Can't add a reference to the specified file."
 
приложите исходники, я гляну. Собираете библу в студии? У вас Excel 64-разрядный? увидел, что да - х64
Цитата
написал:
Tools-References-Browse..
- это для COM
Изменено: bedvit - 07.06.2018 15:01:31
«Бритва Оккама» или «Принцип Калашникова»?
 
Кстати, у Вас в проекте в "defFile.def" вместо EXPORTS записано EXPORT. Уверены, что S там лишняя?
Изменено: Дмитрий Щербаков - 07.06.2018 15:03:15
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Дмитрий Щербаков написал:
вместо EXPORTS записано EXPORT.
Правильно EXPORTS
«Бритва Оккама» или «Принцип Калашникова»?
 
Собирал в Visual Studio 2017
 
Спасибо огромное, теперь работает))
 
Пересобрал - проект рабочий, если правильно экспортировать функцию - в defFile.def - "EXPORTS".
«Бритва Оккама» или «Принцип Калашникова»?
 
Прошу и мне помочь. У меня win 7 64bit и Exel 2010 64bit. Просмотрел эту тему, взял уже готовый макрос с библиотекой от OSA913 (dll.rar). Распаковал. Положил библиотеку в C:\Test. Немного изменил код VBA (указан ниже). При попытке выполнить процедуру Test выдает  - Can't faind Dll entry points square in C:\Test\square.dll.
Код
Declare PtrSafe Function square Lib "C:\Test\square.dll" (ByRef x As Double) As Double
Function CallSQ(x As Double)
CallSQ = square(x)
End Function
Sub Test()
   a = CallSQ(2)
End Sub


Подскажите что неправилно делаю? Ведь уже был выложен готовый, рабочий код?
Изменено: RainMan - 16.12.2019 16:47:14
 
Это потому, что сборка с ошибкой, см. пост 14,15
Вот правильная версия.
«Бритва Оккама» или «Принцип Калашникова»?
Страницы: 1
Наверх