2014-10-08 29 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.FormulaArraynewExcelCell.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工作正常。

+0

你踩通/調試的代碼..?錯誤消息告訴你到底是什麼錯誤或者是什麼東西來糾正它..你是否嘗試過註釋公式來縮小這兩個中哪一個不正確? – MethodMan 2014-10-08 15:28:24

+0

@DJKRAZE,我通過了,我知道它在哪裏失敗(我在我的代碼中提到過),現在如果我將第一個公式放在第一位,那麼這將不起作用。如果我手動把它公式工作正常。 – ManishChristian 2014-10-08 15:31:40

+0

它在這一行失敗'newExcelCell.FormulaArray = strAvgFormula' strAvgFormula是一個數組或字符串..這似乎是問題..可以被鑄造'ToArray()' – MethodMan 2014-10-08 15:35:38

回答

0

所以,最後我得到了解決這個問題的方法。

原來,(這是我的感覺),要麼在Excel未從字符串接受公式strAvgFormula或它搞的一團糟,因爲使用偏移單元格引用起來。

我必須使用直接單元格引用。

這是我的工作式:

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))))";