-1

VBA で XLOPER 型変数を処理する方法がわかりません。Xloper 変数、c++ DLL 、およびXLL アドインの関係を説明する Web ページはたくさんありますが、XLL フレームワークを使用せずに xloper を直接 VBA に返す dll に c++ 関数を記述する必要があります。(dll の関数は Excel ユーザーではなく VBA コードによって呼び出されるため、ユーザー定義関数は必要ありません)。

実際、私は Excel VSTO をコーディングしており、そこから C++ コードを呼び出す必要があります。xloper 変数は XLL に非常に役立つことがわかったので、この変数タイプを VBA/VB.Net で直接使用したいと考えています。それで、それは可能ですか?

編集 :

わかりにくかったらすみません。たとえば、この C++ 関数を作成して、Excel から Int を受け取り、Excel への xloper variale として同じ値に 5 を加えた値を返します。

  _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アドイン開発、スティーブダルトンによる第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 に答える