繁体   English   中英

Excel VBA C ++ .dll

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM