Я создал пользовательскую функцию XLL +, sum1, и она может работать без проблем в Excel после добавления этой надстройки. Но сейчас я создаю еще один XLL, скажем, sum2. Я хотел бы позвонить sum1 в этом добавлении в sum2. Поскольку sum1 и sum2 находятся в разных XLL, они не могут быть вызваны напрямую, и для этого нужны коды. Кто-нибудь сталкивался с этой проблемой раньше и есть ли хороший способ сделать это?
Я погуглил проблему и нашел приведенные ниже коды, которые выполняются с помощью функции оценки и функции UDF. Но кажется, что код очень старый и подходит для visual studio 2005, но не для 2012, и я могу получить ошибку #Name при запуске.
Буду очень признателен, если кто-то может мне помочь в этом. Большое спасибо.
// 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";`enter code here`
if (!rc)
rc = xloRef.Excel(xlfEvaluate, 1, &xloName);
if (!rc)
rc = xloResult.Excel(xlUDF, 2, &xloRef, &CXlOper(DayCount, 0));
return xloResult.Ret();
}
Первый важный момент, на который следует обратить внимание: XLL — это DLL.
При сборке XLL (DLL) Visual studio также должна создать файл LIB с тем же базовым именем (т. Е. Если первый называется project1.XLL, то он также должен создать project1.LIB).
Если вы добавляете файл заголовка с соответствующим определением функции во второй проект, а также добавляете библиотеку, созданную с помощью первого проекта, во второй проект, VS должен позаботиться о грязных битах вызова GetProcAddress () и т. Д.
extern "C" __declspec( dllimport )
LPXLOPER CalDaysInYear2(short DayCount);
Обратите внимание, что заголовок для второго проекта использует dllimport, а не dllexport.
Других решений пока нет …