我希望能够从VBA调用我的自定义函数。
我的自定义函数在C++中声明:
这是该领域中一个真实函数的简化版本,它可以返回字符串、双精度浮点数或者数组。当然,在这里我只返回一个字符串,但是这限制了我的UDF的返回类型为
我可以使用
如果我按照这里所建议的方法从VBA调用我的函数:
我的自定义函数在C++中声明:
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;}
这是该领域中一个真实函数的简化版本,它可以返回字符串、双精度浮点数或者数组。当然,在这里我只返回一个字符串,但是这限制了我的UDF的返回类型为
LPXLOPER12
。我可以使用
xlfRegister
成功地注册我的函数,并指定pxTypeText
为"U$"
。然后我可以从Excel中调用我的UDF。=HelloWorld()
它有效!
如果我按照这里所建议的方法从VBA调用我的函数:
Sub macro_test()
Dim hw As Variant
hw = Application.Run("D:\Path\MyAddIn.xll!HelloWorld")
End Sub
我从Application.run得到一个错误信息:
运行时错误'1004':应用程序定义或对象定义错误
如果我尝试按照这里建议的方法从VBA调用我的函数:
Private Declare PtrSafe Function HelloWorld Lib "C:\Path\MyAddIn.xll" () As Variant
Sub macro_test()
Dim hw As Variant
hw = HelloWorld()
End Sub
我得到了一个空结果,而不是"Hello World"
。
我做错了什么?
其他信息:
- 使用Excel 2013
- 使用VS 2017 15.5
- 使用第一种方法(
Application.Run
),VBA没有调用我的函数(我无法通过调试器进入我的函数)。 - 使用第二种方法,VBA调用了我的函数(我可以通过调试器进入我的函数)。
- 使用第二种方法,在我的
xltype
中添加xlbitDLLFree
时,函数xlAutoFree12
没有被调用,这让我觉得VBA可能没有正确地理解返回值。
Shell
会是答案,所以我承认我的动机是为了被通知线程的添加。如果您推荐的解决方案符合答案的要求,我建议您将它们发布为答案,并且我将授予积分,就像我为下面@Charles William的答案所做的那样。 - Variatus