我按照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;
}