我不知道如何在VBA中处理XLOPER类型变量。有很多网页解释了Xloper变量,c ++ DLL 和 XLL加载项之间的关系,但是我需要在一个dll中编写c ++函数,将xloper直接返回到没有XLL框架的VBA。 (不需要用户定义函数,因为来自dll的函数将由VBA代码调用 - 而不是由Excel用户调用)。
确实我正在编写Excel VSTO,我需要从中调用c ++代码。我发现xloper变量对XLL非常有用,所以我想直接在VBA / VB.Net中使用这个变量类型。那有可能吗?
编辑:
抱歉,如果我不清楚,那么例如我使这个c ++函数从excel接收一个Int并返回相同的值加上5作为xloper变量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?
答案 0 :(得分:1)
最后,我仔细阅读了由Steve Dalton撰写的“C / C ++ Excel第二版Excel中的Excel加载项开发”#34;它回答了问题,并为其提供了源代码。如果要执行此操作,则需要创建一个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;
}