2013-01-11 83 views
1

我想傳遞一個範圍(此時爲1d)到我的函數中,並返回一個包含範圍公式的字符串數組。如何使用ExcelDNA從一個範圍獲取Excel公式?

這裏是我的(不工作)到目前爲止的代碼:

public static object[,] ReadFormulas([ExcelArgument(AllowReference=true)]object arg) 
    { 
     ExcelReference theRef = (ExcelReference)arg; 
     object[,] o = (object[,])theRef.GetValue(); 
     string[,] res = new string[o.GetLength(1),1]; 
     for(int i=0;i<o.GetLength(1);i++) 
     { 
      ExcelReference cellRef = new ExcelReference(theRef.RowFirst+i, theRef.ColumnFirst); 
      res[i,0] = XlCall.Excel(XlCall.xlfGetFormula, cellRef) as string; //Errors here 
     } 
     return res; 
    } 

回答

4

的GET.FORMULA(xlfGetFormula)功能允許在只有宏表。爲了從工作表中調用它,您的Excel-DNA功能應該被標記爲IsMacroType=true,像這樣:

[ExcelFunction(IsMacroType=true)] 
public static object[,] ReadFormulas(
     [ExcelArgument(AllowReference=true)]object arg) {...} 

另外,你需要在你的循環構建新ExcelReference的時候要小心一點。默認情況下,參考中引用的工作表將是當前工作表,而不是傳入的參考工作表。您應該明確地將SheetId傳遞到新的ExcelReference中。您的索引中還有一些有趣的東西 - 可能o.GetLength(1)不是您想要的。

以下版本似乎工作:

[ExcelFunction(IsMacroType=true)] 
public static object[,] ReadFormulasMacroType(
     [ExcelArgument(AllowReference=true)]object arg) 
{ 
    ExcelReference theRef = (ExcelReference)arg; 
    int rows = theRef.RowLast - theRef.RowFirst + 1; 
    object[,] res = new object[rows, 1]; 
    for(int i=0; i < rows; i++) 
    { 
     ExcelReference cellRef = new ExcelReference( 
      theRef.RowFirst+i, theRef.RowFirst+i, 
      theRef.ColumnFirst,theRef.ColumnFirst, 
      theRef.SheetId); 
     res[i,0] = XlCall.Excel(XlCall.xlfGetFormula, cellRef); 
    } 
    return res; 
} 
相關問題