ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – 从VBA调用xll UDF

2019-08-28 07:04:59  阅读:378  来源: 互联网

标签:c excel vba excel-vba xll


我想从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;}

这是来自该字段的实际函数的简化版本,可以返回String或double或偶数数组.当然这里我只返回一个字符串,但是这会将我的UDF的返回类型限制为LPXLOPER12.

我可以使用xlfRegister成功注册我的函数,指定pxTypeText为“U $”.然后我可以从Excel调用我的UDF:

=HelloWorld()

它的工作原理!

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

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

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

Run-time error ‘1004’: Application-defined or object-defined error

如果我尝试按照建议here从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调用我的函数(我可以使用调试器进入我的函数).
>使用第二种方法,当我将xlbitDLLFree添加到我的xltype时,不会调用函数xlAutoFree12,这让我觉得VBA不能正确理解返回值.

解决方法:

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

var=Application.run("HelloWorld")

您也可以使用Evaluate

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和字符数)

标签:c,excel,vba,excel-vba,xll
来源: https://codeday.me/bug/20190828/1749317.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有