首先发布在这里 . 我正在尝试按照众多教程编写C dll作为Excel函数并将其作为Excel函数运行,但似乎无法使其工作 . 我正在运行Windows 10 64位,Visual Studio Community 2017和Excel 2016 64位 .
我按照那里的教程进行了操作 . 我作为“Windows桌面向导”启动了一个新项目,并创建了一个空项目作为DLL . 这是我的代码 . 我的项目下的“Source Files”文件夹中只有这两个文件 .
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),函数返回零 .
我遇到的另一个问题是当我尝试将此作为参考时,在VBA函数声明中使用funct.cpp和ByRef而不是ByVal进行适当的更改(squareFxn(double&x)),我正在阅读访问错误 . 我尝试以管理员身份运行Excel,但无济于事 .
有人知道这里发生了什么吗?任何帮助将不胜感激!!
1 回答
您可能需要在VBA中使用包装器函数,以便将表示单元格的Variant(14个字节)转换为Double(8个字节) . 至少,这适用于我的情况:VSE2017,x64 DLL-build与XL2016x64一起构建 . 例如:
在CPP中:
在VBA中:
您还需要修改WS_myVBAfunc,以便它接受并返回整个范围的单元格 . 这大大加快了整个过程 .