如何直接从c ++ dll将XLOPER(Excel变量)返回到VBA?

时间:2014-12-14 20:02:28

标签: c++ vba vsto xll

我不知道如何在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?

1 个答案:

答案 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;
}