1

我正在使用 Microsoft 的开发框架(Excel 2010)在 C++ 中编写一个 Excel 插件。

我想知道是否可以用 C++ 编写一个具有可变数量参数的 Excel 函数,例如 MAX、MIN、AVERAGE ...

提前致谢。

4

3 回答 3

0

Excel 加载项是作为 COM 对象构建的,对吗?

您是否尝试过在 COM 接口定义中使用该[vararg]属性?

于 2013-03-28T17:42:41.730 回答
0

假设您正在对 XLL 接口进行编码,那么 AFAIK 处理可变数量参数的唯一方法是将每个参数依次声明为您要处理的最大数量(受 Excel 版本限制),然后检查哪些参数缺失。

于 2013-03-28T18:22:20.307 回答
0

这是一个使用http://xll.codeplex.com处理多达 16 个参数的示例。

// 16 LPOPERs
#define XLL_LPOPERSX XLL_LPOPERX XLL_LPOPERX XLL_LPOPERX XLL_LPOPERX XLL_LPOPERX XLL_LPOPERX     XLL_LPOPERX XLL_LPOPERX \
                 XLL_LPOPERX XLL_LPOPERX XLL_LPOPERX XLL_LPOPERX XLL_LPOPERX XLL_LPOPERX XLL_LPOPERX XLL_LPOPERX
static AddInX xai_functional_args(
    FunctionX(XLL_LPOPERSX, _T("?xll_functional_args"), _T("FUNCTIONAL.ARGS"))
    .Arg(XLL_LPOPERSX, _T("Arg1, ..."), _T("are a numeric arguments or NA() to indicate a missing argument."))
    .Category(CATEGORY)
    .FunctionHelp(_T("Return an array for the second argument to FUNCTIONAL.BIND."))
    .Documentation(
        _T("Non numeric arguments will not be bound.")
    )
);
LPOPER WINAPI
xll_functional_args(LPOPERX px)
{
#pragma XLLEXPORT
    static OPER o;

    o.resize(0,0);

    for (LPOPERX* ppx = &px; (*ppx)->xltype != xltypeMissing && ppx - &px < 16; ++ppx) {
        o.push_back(**ppx);
    }

    o.resize(1, o.size());

    return &o;
}
于 2013-03-31T21:20:34.877 回答