Как вернуть XLOPER (переменную Excel) в VBA непосредственно из DLL C ++?

Я понятия не имею, как обрабатывать переменную типа 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?

-1

Решение

наконец, я внимательно прочитал книгу «Разработка надстроек 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;
}
1

Другие решения


По вопросам рекламы [email protected]