Excel VBA C ++ .dll - PullRequest
       4

Excel VBA C ++ .dll

0 голосов
/ 12 мая 2018

Первый пост здесь.Я пытаюсь следовать многочисленным учебникам по компиляции DLL C ++ как функции Excel и запуску ее как функции Excel, но не могу заставить ее работать.Я использую 64-разрядную версию Windows 10, 64-разрядную версию Visual Studio Community 2017 и Excel 2016.

Я следовал инструкциям.Я запустил новый проект как «Мастер рабочего стола Windows» и создал пустой проект как DLL.Это мой код ниже.В папке «Исходные файлы» моего проекта есть только эти два файла.

funct.cpp:

double __stdcall squareFxn(double x) {
    return x * x;
}

Это мой Def-файл, defFile.def:

LIBRARY "square"
EXPORTS
squareFxn

В свойствах проекта я обязательно установил Платформук x64 в диспетчере конфигурации и добавили «defFile.def» без кавычек в файл определения компоновщика / ввода / модуля.

Отлично скомпилировано.Я поместил в VBA следующее:

Declare PtrSafe Function squareFxn Lib "C:\MyPath\square.dll" (ByVal x As Double) As Double

Когда я отлаживал в Visual Studio и запускал в ячейке Excel:

=squareFxn(5)

Visual Studio говорит, что x - это чрезвычайно малое число(6.234E-310) и функция возвращает ноль.

Другая проблема, с которой я сталкиваюсь, это когда я пытаюсь сделать это как ссылку, с соответствующими изменениями (squareFxn (double & x) в функции.Cpp и ByRef вместо ByVal в объявлении функции VBA), я получаю ошибку доступа для чтения.Я пытался запустить Excel в качестве администратора, но безрезультатно.

Кто-нибудь знает, что здесь происходит?Любая помощь будет принята с благодарностью !!

1 Ответ

0 голосов
/ 01 июля 2018

Вам может понадобиться функция-обертка в VBA, чтобы привести вариант (14 байт), представляющий ячейку, к двойному (8 байт). По крайней мере, это работает в моей ситуации: VSE2017, x64 DLL-build вместе с XL2016x64. Например:

в CPP:

extern "C" __declspec(dllexport) double __cdecl myCPPfunc(double x)
{
    return some_double_expression;
}

в VBA:

Public Declare PtrSafe Function myVBAfunc Lib "complete_path_to_my.DLL" Alias "myCPPfunc" (ByVal x As Double) As Double

Function WS_myVBAfunc(ByVal x#)
Dim result#
result = myVBAfunc(x)
WS_myVBAfunc = result
End Function

Вы также хотели бы изменить WS_myVBAfunc, чтобы он принимал и возвращал весь диапазон ячеек. Это значительно ускоряет весь процесс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...