首页 文章

Excel VBA C .dll

提问于
浏览
1

首先发布在这里 . 我正在尝试按照众多教程编写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 回答

  • 0

    您可能需要在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,以便它接受并返回整个范围的单元格 . 这大大加快了整个过程 .

相关问题