可以使用以下命令多次将相同的 XLL 函数注册为自定义工作表函数xlfRegister
.
当调用XLL函数时,有什么方法可以找出工作表中使用哪个名称来调用该函数(除了解析Excel公式,这可能不是很可靠)?
Malick 的答案可以为您提供当前函数的注册名称,但如果您在多个名称下注册相同的函数,则该函数不起作用 - 它只会返回第一个函数xlfGetDef
文档。
解析公式并不可靠:例如,如果Foo1
and Foo2
都是指向实现的注册名称foobar
, 里面foobar
你无法知道公式的哪一部分=IF(B1, Foo1(A1) * Foo2(A2), Foo1(Foo2(A2))
当前正在执行,特别是在线程模式下。
您可以定义全部指向的静态函数存根foobar
,但要更普遍地解决这个问题,您可以使用xlOil https://gitlab.com/stevecu/xloil(免责声明:我写的)。 xlOil 允许您使用以下语法注册 lambda:
auto foobar(int whichOne, const ExcelObj& arg)
{
...
return xloil::returnValue(...)
}
...
auto registerId = RegisterLambda<>(
[](const ExcelObj& arg1)
{
return foobar(1, arg1);
})
.name("Foo1")
.help("Appears in Wizard")
.registerFunc();
(the ExcelObj
这只是一个安全的包装XLOPER12
)。通过捕获 lambda 中的值,您可以将标识符传递给实现foobar
让它知道正在调用哪个别名。或者,通过将第一个 lambda 参数的类型指定为const FuncInfo&
它将收到一个包含注册信息的结构,例如函数名称。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)