这里是我的C#代码来写入ArrayFormula到Excel中的某个单元格。
我正在使用UFT(统一功能测试),它使用C#作为自定义代码。现在C#excel range.FormulaArray不工作
String sheetName = "xyz";
String wsMethodName = "abc";
int i = 2;
Excel.Application xlApp = null;
xlApp = new Excel.ApplicationClass();
wb = xlApp.Workbooks.Open(srcFile,
0, false, 5, "", "", false, Excel.XlPlatform.xlWindows, "",
true, false, 0, true, false, false);
worksheet = (Excel.Worksheet)wb.Worksheets[sheetName];
Excel.Range excelCell = (Excel.Range)worksheet.get_Range("B2", "B21");
foreach (Excel.Range c in excelCell)
{
//
strAvgFormula =
"=AVERAGEIFS(" +
"(OFFSET(\'" + sheetName + "\'!$A$1,2,2,COUNTA(\'" + sheetName + "\'!$A:$A)-2,1))," +
"OFFSET(\'" + sheetName + "\'!$A$1,2,16382,COUNTA(\'" + sheetName + "\'!$A:$A)-2,1)," +
"(MID(C" + i + ",1,(FIND(\"-\",C" + i + "))-2))," +
"OFFSET(\'" + sheetName + "\'!$A$1,2,16383,COUNTA(\'" + sheetName + "\'!$A:$A)-2,1)," +
"(MID(C" + i + ",(FIND(\"-\",C" + i + ")+1),(FIND(\"/\",C" + i + "))-(FIND(\"-\",C" + i + ")+1))))";
this.CodeActivity16.Report("strAvgFormula",strAvgFormula);
//
strMaxFormula =
"=MAX(" +
"IF((OFFSET(\'" + sheetName + "\'!$A$1,2,16382,COUNTA(\'" + sheetName + "\'!$A:$A)-2,1)=MID(C" + i + ",1,(FIND(\"-\",C" + i + "))-2))*" +
"(OFFSET(\'" + sheetName + "\'!$A$1,2,16383,COUNTA(\'" + sheetName + "\'!$A:$A)-2,1)=MID(C" + i + ",(FIND(\"-\",C" + i + ")+2)," +
"(FIND(\"/\",C" + i + "))-(FIND(\"-\",C" + i + ")+2)))," +
"OFFSET(\'" + sheetName + "\'!$A$1,2,2,COUNTA(\'" + sheetName + "\'!$A:$A)-2,1)))";
this.CodeActivity16.Report("strMaxFormula",strMaxFormula);
if (c.Value2.ToString() == wsMethodName)
{
newExcelCell = (Excel.Range)worksheet.get_Range("F" + i, "F" + i);
newExcelCell.Clear();
newExcelCell.FormulaArray = strAvgFormula; //Failing @ this line, error is mentioned below
//newExcelCell.Value = strAvgFormula;
newExcelCell = (Excel.Range)worksheet.get_Range("G" + i, "G" + i);
newExcelCell.Clear();
newExcelCell.FormulaArray = strMaxFormula;
//newExcelCell.Value = strMaxFormula;
break;
}
i ++;
}
wb.Save();
xlApp.Workbooks.Close();
xlApp.Quit();
releaseObject(newExcelCell);
releaseObject(excelCell);
releaseObject(worksheet);
releaseObject(wb);
releaseObject(xlApp);
private void releaseObject(object obj)
{
try
{
Marshal.ReleaseComObject(obj);
obj = null;
}
catch (Exception ex)
{
obj = null;
CodeActivity16.Report("Error","Unable to release the Object " + ex.ToString());
}
finally
{
GC.Collect();
}
}
,如果我复制从打印输出结果相同的公式,并将其粘贴在我的期望的细胞,它工作正常。
逃生角色正在正常工作。
如果我改变newExcelCell.FormulaArray到newExcelCell.Value,比它被写入出色,但它工作正常的公式,而不是ARRAYFORMULA(像我们一样按Ctrl + Shift +回车)。
这是我从结果文件中得到的错误:
您键入的公式包含错误。请尝试以下方法之一:
•确保包含所有括号和必需的参数。
•要获得使用功能的帮助,请单击“公式”选项卡上的“功能向导”(在功能库组中)。
•如果您包含对其他工作表或工作簿的引用,请验证引用是否正确。
•如果您不想输入公式,请避免使用等号(=)或减号( - ),或在其前面加上单引号(')。
•有关常见配方问题的更多信息,请单击帮助。
在此先感谢您的任何帮助或建议。
UPDATE:
这里是我想写的strAvgFormula公式。
"=AVERAGEIFS(" +
"(OFFSET('1'!$A$1,2,2,COUNTA('1'!$A:$A)-2,1))," +
"OFFSET('1'!$A$1,2,16382,COUNTA('1'!$A:$A)-2,1),(MID(C2,1,(FIND("-",C2))-2))," +
"OFFSET('1'!$A$1,2,16383,COUNTA('1'!$A:$A)-2,1),(MID(C2,(FIND("-",C2)+1),(FIND("/",C2))-(FIND("-",C2)+1))))"
公式strMaxFormula工作正常。
你踩通/调试的代码..?错误消息告诉你到底是什么错误或者是什么东西来纠正它..你是否尝试过注释公式来缩小这两个中哪一个不正确? – MethodMan 2014-10-08 15:28:24
@DJKRAZE,我通过了,我知道它在哪里失败(我在我的代码中提到过),现在如果我将第一个公式放在第一位,那么这将不起作用。如果我手动把它公式工作正常。 – ManishChristian 2014-10-08 15:31:40
它在这一行失败'newExcelCell.FormulaArray = strAvgFormula' strAvgFormula是一个数组或字符串..这似乎是问题..可以被铸造'ToArray()' – MethodMan 2014-10-08 15:35:38