Excel XLL命令(非UDF):xlSet无法设置多个值

Excel XLL命令(非UDF):xlSet无法设置多个值,excel,xll,Excel,Xll,我对XLL编程相当陌生,但我相信我已经完成了关于这个小问题的家庭作业。我试图使用xlSet设置多个单元格值,但xlSet只是复制数组的第一个值,就好像我传递了一个引用一样。相反,如果我连续为每个单元格单独调用xlSet,它就会工作。但它很难看,毫无疑问,速度很慢 我知道不能从UDF调用xlSet。这不是UDF。在其他地方,我看到有人在xlMulti中存在结构对齐问题,但我正在将相同的xlMulti发送回Excel,所以这不是问题。(无论如何,我尝试了/Zp8编译器开关。) 我从SDK框架的东西开

我对XLL编程相当陌生,但我相信我已经完成了关于这个小问题的家庭作业。我试图使用xlSet设置多个单元格值,但xlSet只是复制数组的第一个值,就好像我传递了一个引用一样。相反,如果我连续为每个单元格单独调用xlSet,它就会工作。但它很难看,毫无疑问,速度很慢

我知道不能从UDF调用xlSet。这不是UDF。在其他地方,我看到有人在xlMulti中存在结构对齐问题,但我正在将相同的xlMulti发送回Excel,所以这不是问题。(无论如何,我尝试了/Zp8编译器开关。)

我从SDK框架的东西开始,例如TempActiveRef(1,1,0,2),然后用更直接的XLCALL.H东西替换这些调用,主要是为了增加我在这里得到响应的机会

Office 2010,VSTO 2010,Win7 64位SP1

以下是哪些有效,哪些无效:

__declspec(dllexport) int WINAPI testCmd(void)
{
    XLOPER12 ref, xValsInMulti, xResSet;
    XLMREF12 mref;
    int i, res;

// Build an xltypeRef XLOPER12 that points to three cells, A2:C2
    res = Excel12(xlSheetId, &ref, 0);
    if (res != xlretSuccess) return 0;
    ref.xltype = xltypeRef;
    ref.val.mref.lpmref = &mref;
    mref.count = 1;
    mref.reftbl[0].rwFirst = mref.reftbl[0].rwLast = 1;
    mref.reftbl[0].colFirst = 0;
    mref.reftbl[0].colLast = 2;

// Fetch the cell values into an xltypeMulti.
// This works. Returns 0. And xValsInMulti.type becomes xlTypeMulti
    res = Excel12(xlCoerce, &xValsInMulti, 1, &ref );

// Change cell reference to the next row (A3:C3)
    mref.reftbl[0].rwFirst = mref.reftbl[0].rwLast = 2;

// Attempt to set the values. Doesn't work. All cells become value of A2.
    Excel12(xlSet, &xResSet, 2, &ref, xValsInMulti);
    Excel12(xlcAlert, 0, 1, &xResSet); // Displays "TRUE"

// Try again (in the next row) setting each cell individually. This works.
    mref.reftbl[0].rwFirst = mref.reftbl[0].rwLast = 3;
    for (i=0; i<3; i++)
    {
        mref.reftbl[0].colFirst = mref.reftbl[0].colLast = i;
        Excel12(
            xlSet, &xResSet, 2, &ref, xValsInMulti.val.array.lparray+i
        );
        Excel12(xlcAlert, 0, 1, &xResSet); // Displays "TRUE"
    }

    Excel12(xlFree, 0, 1, &xValsInMulti);

    return 1;
}
\uuuu declspec(dllexport)int-WINAPI-testCmd(void)
{
XLOPER12 ref,xValsInMulti,XRESET;
XLMREF12-mref;
int i,res;
//构建一个指向三个单元格A2:C2的xltypeRef XLOPER12
res=Excel12(xlSheetId和ref,0);
如果(res!=xlretSuccess)返回0;
ref.xltype=xltypeRef;
ref.val.mref.lpmref=&mref;
mref.count=1;
mref.reftbl[0]。rwFirst=mref.reftbl[0]。rwLast=1;
mref.reftbl[0].colFirst=0;
mref.reftbl[0]。colLast=2;
//将单元格值提取到xltypeMulti中。
//此操作有效。返回0。xValsInMulti.type变为xlTypeMulti
res=Excel12(xl强制、&xValsInMulti、1和ref);
//将单元格引用更改为下一行(A3:C3)
mref.reftbl[0]。rwFirst=mref.reftbl[0]。rwLast=2;
//尝试设置值。不起作用。所有单元格都成为A2的值。
Excel12(xlSet和XRESET、2和ref、xValsInMulti);
Excel12(xlcAlert、0、1和xreset);//显示“TRUE”
//请再试一次(在下一行中)分别设置每个单元格。此操作有效。
mref.reftbl[0]。rwFirst=mref.reftbl[0]。rwLast=3;

对于(i=0;我不确定我是否理解您的问题,但我测试了您的代码,我没有遇到任何问题,
Excel12(xlSet,&xreset,2,&ref,xValsInMulti)
将单元格A3:C3的值换行为单元格A2:C2的值-所有单元格都不取A2的值(如循环中所示).ps:在Excel 2016-64位单击上测试,非常感谢您在您的系统上测试我的代码。由于您的成功,我对我的源代码感到安全,因此我将重新检查生成文件与我的环境的匹配情况。