在Excel XLL SDK中,从用户定义的函数调用xlfRegisterId时,为什么会失败



我按照Malik的回答来回答这个问题,试图获得我的用户定义函数的注册id。如果我像这个一样将代码插入我的xlAutoOpen函数

extern "C" __declspec(dllexport) int xlAutoOpen(void)
{
XLOPER12 xDLL;  
Excel12f(xlGetName, &xDLL, 0);
Excel12f(xlfRegister, 0, 11, (LPXLOPER12)&xDLL,
(LPXLOPER12)TempStr12(L"exampleAddin"),
(LPXLOPER12)TempStr12(L"QQQ"),
(LPXLOPER12)TempStr12(L"exampleAddin"),
(LPXLOPER12)TempStr12(L"v1,v2"),
(LPXLOPER12)TempStr12(L"1"),
(LPXLOPER12)TempStr12(L"myOwnCppFunctions"),
(LPXLOPER12)TempStr12(L""),
(LPXLOPER12)TempStr12(L""),
(LPXLOPER12)TempStr12(L"An example"),
(LPXLOPER12)TempStr12(L""));
XLOPER12  xRegId;
Excel12(xlfRegisterId, &xRegId, 2, (LPXLOPER12)&xDLL, (LPXLOPER12)TempStr12("exampleAddin")); //xRegId will be XltypeNum
/* Free the XLL filename */
Excel12f(xlFree, 0, 1, (LPXLOPER12)&xDLL);

return 1;
}

它正确地给了我xRegId中的id。

然而,如果我试图从我的用户定义函数中调用它,比如这个

extern "C" __declspec(dllexport) LPXLOPER12 exampleAddin(LPXLOPER12 x1, LPXLOPER12 x2)
{
XLOPER12  xDLL, xRegId;
Excel12(xlGetName, &xDLL, 0);// xDLL will be xltypeStr
Excel12(xlfRegisterId, &xRegId, 2, (LPXLOPER12)&xDLL, (LPXLOPER12)TempStr12("exampleAddin"));

// ... my user defined code is here
}

它在xRegId中返回一个空/错误状态。

请注意,我直接从电子表格单元格中调用该函数。

出了什么问题?有没有办法在我的用户定义函数中获取xlfRegisterId?

谢谢

感谢Steve Dalton的精彩著作,我找到了答案。用户定义的函数需要注册宏函数权限,在上述定义中的QQQ后面添加一个#。所以代码变成

extern "C" __declspec(dllexport) LPXLOPER12 exampleAddin(LPXLOPER12 x1, LPXLOPER12 x2)
{
XLOPER12  xDLL, xRegId;
Excel12(xlGetName, &xDLL, 0);// xDLL will be xltypeStr
Excel12(xlfRegisterId, &xRegId, 2, (LPXLOPER12)&xDLL, (LPXLOPER12)TempStr12("exampleAddin"));

// ... my user defined code is here
}
extern "C" __declspec(dllexport) int xlAutoOpen(void)
{
XLOPER12 xDLL;  
Excel12f(xlGetName, &xDLL, 0);
Excel12f(xlfRegister, 0, 11, (LPXLOPER12)&xDLL,
(LPXLOPER12)TempStr12(L"exampleAddin"),
(LPXLOPER12)TempStr12(L"QQQ#"),
(LPXLOPER12)TempStr12(L"exampleAddin"),
(LPXLOPER12)TempStr12(L"v1,v2"),
(LPXLOPER12)TempStr12(L"1"),
(LPXLOPER12)TempStr12(L"myOwnCppFunctions"),
(LPXLOPER12)TempStr12(L""),
(LPXLOPER12)TempStr12(L""),
(LPXLOPER12)TempStr12(L"An example"),
(LPXLOPER12)TempStr12(L""));
XLOPER12  xRegId;
Excel12(xlfRegisterId, &xRegId, 2, (LPXLOPER12)&xDLL, (LPXLOPER12)TempStr12("exampleAddin")); //xRegId will be XltypeNum
/* Free the XLL filename */
Excel12f(xlFree, 0, 1, (LPXLOPER12)&xDLL);

return 1;
}

最新更新