liusong0313 2013-12-17 13:21 采纳率: 0%
浏览 977

如何在一个XLL+ 程序中call另外一个XLL+中的函数

大家好,我的问题是,如何在一个XLL+程序中call另外一个XLL+中的函数。

我已经编好并运行成功了一个XLL+ user defined function,函数为sum1,在excel中加入这个add in以后,可以用sum1函数进行运算。现在我开始编写另外一个XLL,e.g.sum2,而在sum2程序中我想直接call sum1函数,然后由于两个函数在两个不同的XLL中,不能直接call,因此需要进行一定的处理才行。请问各位大牛有碰到过这种情况吗?有什么好的代码或者方法可以使用吗?

在网上查了一些,查到下列代码,是用evaluate和UDF function做的,但是这个貌似只适用于visual studio 2005,不适用于2012, 在Visual studio 2012下运行不出正确的结果,会显示#Name error

请各位大牛指导和指正!

// Function: CalDaysInYear2
// Purpose: Calls a function in another XLL

//{{XLP_SRC(CalDaysInYear2)
// NOTE - the FunctionWizard will add and remove mapping code here.
// DO NOT EDIT what you see in these blocks of generated code!
IMPLEMENT_XLLFN2(CalDaysInYear2, "RI", "CalDaysInYear2",
"DayCount", "Date & Time", "Calls a function in another XLL,"
" which returns number of days in a year according to the"
" day count", "Day count convention\000", "\0appscope=1\0",
1)

extern "C" __declspec( dllexport )
LPXLOPER CalDaysInYear2(short DayCount)
{
XLL_FIX_STATE;
CXlOper xloResult;
//}}XLP_SRC

static int xlfEvaluate = 257;
static int xlUDF = 255;

CXlOper xloName, xloRef;
int rc = 0;
xloName = "CalDaysInYear";
if (!rc)
    rc = xloRef.Excel(xlfEvaluate, 1, &xloName);
if (!rc)
    rc = xloResult.Excel(xlUDF, 2, &xloRef, &CXlOper(DayCount, 0));

return xloResult.Ret();

}

  • 写回答

1条回答

  • ChatGPTᴼᴾᴱᴺᴬᴵ 2023-02-26 13:13
    关注

    该回答引用ChatGPT

    你可以通过以下步骤在一个XLL+程序中调用另一个XLL+程序中的函数:

    • 在调用另一个XLL+程序中的函数的XLL+程序中,使用CXlWorkbook::LoadXll函数加载另一个XLL+程序。例如,如果要加载名为"sum1.xll"的XLL+程序,可以使用以下代码:

      CXlWorkbook::LoadXll(L"sum1.xll");
      
    • 然后,使用CXlOper类创建参数数组,以便传递给要调用的函数。例如,如果要调用名为"sum1"的函数并传递两个参数,可以使用以下代码:

      CXlOper xloArgs[2];
      xloArgs[0] = 1.0;
      xloArgs[1] = 2.0;
      
    • 最后,使用CXlFunction::Invoke函数调用要调用的函数。例如,如果要调用名为"sum1"的函数并传递两个参数,可以使用以下代码:

      CXlOper xloResult;
      CXlFunction::Invoke(L"sum1", xloResult, 2, xloArgs);
      

    完整的调用另一个XLL+程序中的函数的示例代码如下:

    #include "stdafx.h"
    #include "xllplus.h"
    
    using namespace xll;
    
    int WINAPI xlAutoOpen()
    {
        // Load the other XLL+
        CXlWorkbook::LoadXll(L"sum1.xll");
    
        // Call a function in the other XLL+
        CXlOper xloArgs[2];
        xloArgs[0] = 1.0;
        xloArgs[1] = 2.0;
        CXlOper xloResult;
        CXlFunction::Invoke(L"sum1", xloResult, 2, xloArgs);
    
        // Return success
        return 1;
    }
    

    请注意,在使用CXlWorkbook::LoadXll加载另一个XLL+程序之前,必须确保该程序已在Excel中加载。

    评论

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题