-1

我不知道如何在 VBA 中处理 XLOPER 类型变量。有很多网页解释了 Xloper 变量、c++ DLLXLL 插件之间的关系,但是我需要在没有 XLL 框架的情况下在一个将 xloper 直接返回到 VBA 的 dll 中编写 c++ 函数。(不需要用户定义函数,因为来自 dll 的函数将由 VBA 代码调用 - 而不是由 Excel 用户调用)。

事实上,我正在编写一个 Excel VSTO,我需要从中调用 c++ 代码。我发现 xloper 变量对 XLL 非常有用,所以我想直接在 VBA/VB.Net 中使用这个变量类型。那么有可能吗?

编辑 :

抱歉,如果我不清楚,例如,我让这个 c++ 函数从 excel 接收 Int 并返回相同的值加上 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 吗?

4

1 回答 1

2

最后,我认真阅读了《C / C++ 中的 Excel 插件开发,Steve Dalton 的第 2 版》一书。它回答了这个问题并提供了源代码。如果你想执行这个操作,你需要创建一个 xloper 包装器,前面提到的书的 xloper.cpp 的 xloper_to_v 函数可以完成这项工作。由于版权原因,我不能在这里发布整个代码,只发布一些代码行;我认为它可以提供一些有用的见解:

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;
}
于 2014-12-17T10:17:05.260 回答