Вот мой код 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 + Enter).
Вот эта ошибка, которую я получаю из файла результата:
Введенная формула содержит ошибку. Попробуйте выполнить одно из следующих действий:
• Убедитесь, что вы включили все круглые скобки и необходимые аргументы.
• Чтобы получить помощь по использованию функции, нажмите «Мастер функций» на вкладке «Формулы» (в группе «Библиотека функций»).
• Если вы указали ссылку на другой лист или книгу, убедитесь, что ссылка правильная.
• Если вы не пытаетесь ввести формулу, избегайте использования знака равенства (=) или минуса (-) или перед ним следует одиночный кавычек (').
• Для получения дополнительной информации о проблемах с общей формулой нажмите «Справка».
Заранее благодарим за любую помощь или предложение.
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
@DJKRAZE, я шагнул через, и я знаю, где он терпит неудачу (я упомянул в своем коде), теперь, если я положу 2-ю формулу 1-го, то это не сработает. Формула работает нормально, если я положил ее вручную. – ManishChristian
он не работает в этой строке 'newExcelCell.FormulaArray = strAvgFormula' strAvgFormula - это массив или строка .. это, кажется, проблема .. может ли это быть литовым? ToArray()' – MethodMan