2014-10-08 2 views
-2

Вот мой код 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 работает нормально.

+0

вы ступил через/отлажена код ..? сообщение об ошибке сообщает вам, что именно не так и что-то пытается исправить. попытались ли вы прокомментировать формулу, чтобы сузить, какая из двух неверна? – MethodMan

+0

@DJKRAZE, я шагнул через, и я знаю, где он терпит неудачу (я упомянул в своем коде), теперь, если я положу 2-ю формулу 1-го, то это не сработает. Формула работает нормально, если я положил ее вручную. – ManishChristian

+0

он не работает в этой строке 'newExcelCell.FormulaArray = strAvgFormula' strAvgFormula - это массив или строка .. это, кажется, проблема .. может ли это быть литовым? ToArray()' – MethodMan

ответ

0

Итак, наконец, я получил обходной путь для этой проблемы.

Оказалось (это то, что я чувствую), что либо Excel не принимает формулу из строки strAvgFormula или получить перепутано из-за ссылок на ячейки с помощью Offset.

Я должен использовать ссылку на прямую ячейку.

Вот моя рабочая формула:

int lastUsedRowDiffSheet = worksheet.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell,Type.Missing).Row; 
strAvgFormula = 
      "=AVERAGEIFS('" + sheetName + "\'!C" + iRowCount + ":C" + lastUsedRowDiffSheet + "," 
      + "'" + sheetName + "'!XFC" + iRowCount + ":XFC" + lastUsedRowDiffSheet + "," 
      + "MID(C" + i + ",1,(FIND(\"-\",C" + i + "))-2)," 
      + "'" + sheetName + "\'!XFD" + iRowCount + ":XFD" + lastUsedRowDiffSheet + "," 
      + "(MID(C" + i + ",(FIND(\"-\",C" + i + ")+1),(FIND(\"/\",C" + i + "))-(FIND(\"-\",C" + i + ")+1))))"; 
1

The FormulaArray property also has a character limit of 255.

Обходной может быть, чтобы установить его на менее чем 256 символов, и заменить его часть.Например:

range.FormulaArray = "={1,2,3}"; 
range.Replace("}", ",4,5,6}", XlLookAt.xlPart); 

https://colinlegg.wordpress.com/2012/05/23/working-with-range-formulaarray-in-vba/

http://dailydoseofexcel.com/archives/2005/01/10/entering-long-array-formulas-in-vba/