[英]Excel VBA C++ .dll
第一篇文章在这里。 我正在尝试遵循众多教程,将C ++ dll编译为Excel函数并将其作为Excel函数运行,但似乎无法使其正常工作。 我正在运行Windows 10 64位,Visual Studio Community 2017和Excel 2016 64位。
我已经按照那里的教程。 我以“ Windows桌面向导”启动了一个新项目,并以DLL创建了一个空项目。 这是我的下面的代码。 在我的项目下的“源文件”文件夹中,只有这两个文件。
funct.cpp:
double __stdcall squareFxn(double x) {
return x * x;
}
这是我的Def文件defFile.def:
LIBRARY "square"
EXPORTS
squareFxn
在项目属性中,我确保在配置管理器中将Platform设置为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),该函数返回零。
我遇到的另一个问题是,当我尝试以适当的更改(作为funct.cpp中的squareFxn(double&x)和ByRef而不是VBA函数声明中的ByVal)作为参考时,我正在读取访问错误。 我尝试以管理员身份运行Excel,但无济于事。
有人知道这是怎么回事吗? 任何帮助将不胜感激!!
您可能需要在VBA中使用包装函数,才能将表示单元格的Variant(14字节)强制转换为Double(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,以使其接受并返回整个单元格范围。 这大大加快了整个过程。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.