Я понятия не имею, как обрабатывать переменную типа XLOPER в VBA. Существует множество веб-страниц, объясняющих связь между переменной Xloper и библиотекой c ++. а также Надстройка XLL, однако мне нужно написать функцию c ++ в dll, возвращающую xloper непосредственно в VBA без фреймворка XLL. (Нет необходимости в пользовательской функции, так как функции из DLL будут вызываться кодом VBA, а не пользователями Excel).
На самом деле я кодирую Excel VSTO, и мне нужно вызвать код C ++ из него. Я обнаружил, что переменные xloper очень полезны для XLL, поэтому я хотел бы использовать этот тип переменных в VBA / VB.Net напрямую. Так возможно ли это?
РЕДАКТИРОВАТЬ :
извините, если мне неясно, поэтому, например, я сделал эту функцию c ++, получая Int от excel и возвращая то же значение плюс 5, что и xloper variale для excel.
_declspec(dllexport) xloper _stdcall returnInt( int iVal)
{
xloper pxlval_ret;
int a ;
a =5 + iVal;
pxlval_ret->xltype = xltypeInt;
pxlval_ret->val.w = a ;
return pxlval_ret;
}
но я не знаю, как вызвать его в VBA, переменная возврата VARIANT?
наконец, я внимательно прочитал книгу «Разработка надстроек Excel на C / C ++, 2-е издание, Стив Далтон». Он отвечает на вопрос и предоставляет исходный код для него. Если вы хотите выполнить эту операцию, вам нужно создать упаковщик xloper, функция xloper_to_v, которая является частью xloper.cpp вышеупомянутой книги, выполняет эту работу. Из-за авторских прав я не могу публиковать здесь весь код, а только несколько строк кода; я думаю, что это может дать некоторую полезную информацию:
bool xloper_to_vt(const xloper *p_op, VARIANT &var, bool convert_array)
{
VariantInit(&var); // type is set to VT_EMPTY
switch(p_op->xltype)
{
case xltypeNum:
var.vt = VT_R8;
var.dblVal = p_op->val.num;
break;
case xltypeInt:
var.vt = VT_I2;
var.iVal = p_op->val.w;
break;
case xltypeBool:
// see in the book
case xltypeStr:
// see in the book
case xltypeErr:
// see in the book
case xltypeMulti:
if(convert_array)
{
VARIANT temp_vt;
SAFEARRAYBOUND bound[2];
long elt_index[2];
// see in the book
xloper *p_op_temp = p_op->val.array.lparray;
for(WORD r = 0; r < p_op->val.array.rows; r++)
{
for(WORD c = 0; c < p_op->val.array.columns;)
{
// see in the book
}
}
break;
}
// else, fall through to default option
default: // type not converted
return false;
}
return true;
}