从VBA调用xll UDF

时间:2017-12-09 13:26:23

标签: c++ excel vba excel-vba xll

我想从VBA调用我的一个用户定义函数。

我的用户定义函数在C ++中声明:

cabal2nix

这是字段中实际函数的简化版本,可以返回String或double或even数组。当然这里我只返回一个String,但这会将我的UDF的返回类型限制为XLOPER12*WINAPI HelloWorld()noexcept{ THROWS(); static XLOPER12 res=[](){ static std::array<wchar_t,13>str={ 11,'H','e','l','l','o',' ','W','o','r','l','d','\0'}; XLOPER12 tmp; tmp.xltype=xltypeStr; tmp.val.str=str.data(); return tmp;}(); return &res;}

我可以使用xlfRegister指定LPXLOPER12 pxTypeText来成功注册我的功能。然后我可以从Excel调用我的UDF:

"U$"

它有效!

如果我尝试按照建议here从VBA调用我的函数:

=HelloWorld()

我从Application.run收到错误消息:

  

运行时错误&#39; 1004&#39;:应用程序定义或对象定义的错误

如果我尝试按照建议here从VBA调用我的功能:

Sub macro_test()
    Dim hw As Variant
    hw = Application.Run("D:\Path\MyAddIn.xll!HelloWorld")
End Sub

我得到一个空结果而不是Private Declare PtrSafe Function HelloWorld Lib "C:\Path\MyAddIn.xll" () As Variant Sub macro_test() Dim hw As Variant hw = HelloWorld() End Sub

我做错了什么?

杂项信息:

  • 使用Excel 2013
  • 使用VS 2017 15.5
  • 使用第一种方法("Hello World"),VBA不会调用我的函数(我无法使用调试器进入我的函数)。
  • 使用第二种方法,VBA调用我的函数(我可以使用调试器进入我的函数)。
  • 使用第二种方法,当我向Application.Run添加xlbitDLLFree时,函数xltype未被调用,这使我认为VBA无法正确理解返回值。

1 个答案:

答案 0 :(得分:5)

如果您的XLL已加载且其UDF已注册,因此单元格中的= HelloWord()工作,那么您应该能够像这样从VBA调用它(除非无参数字符串函数存在问题)

var=Application.run("HelloWorld")

您也可以使用评估

var=Application.Evaluate("=HelloWorld()")

我测试了我的REVERSE.TEXT XLL功能,它运行正常。

Sub testing()
Dim var As Variant
var = Application.Run("REVERSE.TEXT", "Charles")
var = Application.Evaluate("=REVERSE.TEXT(""Charles"")")
End Sub

Reverse.Text使用UQQ $注册(有2个参数,Text和字符数)