2

範囲(この時点では1d)を関数に渡し、範囲の数式を含む文字列の配列を返したいと思います。

これまでの私の(機能していない)コードは次のとおりです。

    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

1 に答える 1

6

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;
}
于 2013-01-11T15:01:56.877 に答える