C++ 如何将XLOPER(Excel变量)直接从c+返回到VBA+;动态链接库?
我不知道如何在VBA中处理XLOPER类型的变量。有很多网页解释了XLopor变量、C++ DLL <强>和 XLL Advin之间的关系,但是我需要在DLL中直接调用C++函数来将XLopor直接返回到VBA而不使用XLL框架。(不需要用户定义的函数,因为dll中的函数将由VBA代码调用,而不是由Excel用户调用) 确实,我正在编写一个Excel VSTO,我需要从它调用C++代码。我发现xloper变量对XLL非常有用,所以我想直接在VBA/VB.Net中使用这种变量类型。那有可能吗C++ 如何将XLOPER(Excel变量)直接从c+返回到VBA+;动态链接库?,c++,vba,vsto,xll,C++,Vba,Vsto,Xll,我不知道如何在VBA中处理XLOPER类型的变量。有很多网页解释了XLopor变量、C++ DLL 和 XLL Advin之间的关系,但是我需要在DLL中直接调用C++函数来将XLopor直接返回到VBA而不使用XLL框架。(不需要用户定义的函数,因为dll中的函数将由VBA代码调用,而不是由Excel用户调用) 确实,我正在编写一个Excel VSTO,我需要从它调用C++代码。我发现xloper变量对XLL非常有用,所以我想直接在VBA/VB.Net中使用这种变量类型。那有可能吗 我猜xl
- 我猜xloper可以使用variant类型处理,但我不知道如何处理。 我发现了这个帖子:但是没有明确的答案
对不起,如果我不清楚,所以我举例说,这个C++函数从Excel中接收一个int,并将相同的值加上5作为XLopor变量到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,返回变量是一个变种吗?< /P> < P>最后我仔细阅读了《Steve Dalton C/C++第二版中的EXCEL ADIN开发》一书。它回答了这个问题并提供了源代码。如果你想执行这个操作,你需要创建一个XLopter包装器,XLPropyTosiv函数是前面提到的书的XLPop.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;
}
bool xloper_to_vt(const xloper*p_op,VARIANT&var,bool convert_数组)
{
VariantInit(&var);//类型设置为VT_EMPTY
开关(p_op->xltype)
{
案例xltypeNum:
变量vt=vt_R8;
var.dblVal=p_op->val.num;
打破
案例xltypeInt:
var.vt=vt_I2;
var.iVal=p_op->val.w;
打破
案例xltypeBool:
//在书中看到
案例xltypeStr:
//在书中看到
案例xltypeErr:
//在书中看到
案例xltypeMulti:
if(转换数组)
{
变型温度;
安全排列绑定[2];
长elt_指数[2];
//在书中看到
xloper*p_op_temp=p_op->val.array.lparray;
for(单词r=0;rval.array.rows;r++)
{
对于(单词c=0;cval.array.columns;)
{
//在书中看到
}
}
打破
}
//否则,采用默认选项
默认://类型未转换
返回false;
}
返回true;
}
我已经阅读了Steve Dalton在C/C++第二版中使用Excel Advin开发的财务应用程序,但没有简单的例子,所以我完全丢失了。你不能从电子表格中的函数调用XLopor,VBA不能直接调用它们。因此,你必须在其他问题中回答包装问题PS:如果有人知道有一个库在做这项工作,请告诉我们,然后我将把问题作为答案。Grebe这是另一个问题的重复:(基本上是XLOPER将数据从Excel函数传递到DLL-因为VBA对DLL有不同的调用或使用Visual Studio工具。(您提到的书中的示例可能显示了使用它们的最佳方式)注意,我发现用C编写所有代码比使用VBA更容易,但现在我将介绍VSTO