1

嗨,我有 ac# 程序,它给出了 excel2007 范围,它的公式数组如下

   Excel.Worksheet ws_res = (Excel.Worksheet)
                      wb.Worksheets.Add(mis, mis, mis, mis);
   Excel.Range range_res = (Excel.Range)ws_res.get_Range("A1","HM232");
   range_res.FormulaArray = "=(IF((IF(Sheet4!A1:HM232=1,0,"+
                     "IF(Sheet4!A1:HM232=0,1,Sheet4!A1:HM232)))=1,0,"+
                     "IF((IF(Sheet4!A1:HM232=1,0,"+
                     "IF(Sheet4!A1:HM232=0,1,Sheet4!A1:HM232)))=0,1,("+
                     "IF(Sheet4!A1:HM232=1,0,"+
                     "IF(Sheet4!A1:HM232=0,1,Sheet4!A1:HM232))))))";

它给了我一个例外,说公式是错误的...但是如果打开 excel-2007 并在新工作表中(比如说 sheet5)选择范围 A1:HM232 并将上面的公式直接粘贴到公式栏,然后按 Ctrl +Shift+Enter 一起做一切都很好,... 请问你能告诉我如何用 c# 做同样的事情吗?

我知道如果我使用公式数组来使用 R1C1 样式,但如果我使用

              "=ROUND((IF(Sheet4!A1:HM232=1,0,"+
                 "IF(Sheet4!A1:HM232=0,1,Sheet4!A1:HM232))),0)"

它没有给我任何例外,它就像我直接从 c# 和 excel 执行 Ctrl+Shift+Enter 一样执行

对于上述两个公式,我确实将 A1:HM232 更改为 R1C1:R232C221 再次较短的一个在 c# 中可以正常工作,但较长的一个不能!

4

9 回答 9

2

我有一个额外的复杂性,即我正在开发的人使用西班牙语的 Excel。
要使公式在非英语版本的 Excel 中工作,您必须使用一组不同的函数,即FormulaLocal而不是FormulaFormulaR1C1Local而不是FormulaR1C1等。
一个非常简单的示例,例如=RC[-1]+R4C4对 FormulaArray 有效,但类似=SUMA(SI(FC(-2)=1;F8C(-3):F1000C(-3);0))其中包含 excel函数名称和分号作为参数标记不会 - 您会收到运行时错误。
我发现的解决方法是做类似的事情=SUM(IF(AC9=1,AB$8:AB$1000,0)),即翻译成英文并使用本地公式,而不是 R1C1 ......

令人惊讶的是,
a) 已发布的建议是将 R1C1 用于数组公式,
b) 如果您使用英文函数名称,通常会出现运行时错误。

于 2011-02-11T10:52:48.460 回答
1

看起来您需要修改单元格引用。来自FormulaArray 文档

如果使用此属性输入数组公式,公式必须使用 R1C1 引用样式,而不是 A1 引用样式。

有关 R1C1 参考样式的更多信息:

于 2009-06-25T18:20:21.463 回答
1

问题是公式数组似乎不适用于 R1C1 引用,因为现在我们有一个 RC 列,它使 Excel 混淆了将哪种公式样式应用于 formulaArray let 属性

=Sum(RC2:RC3) 现在既是 RC 格式又是 A1 参考格式。

而且他们还没有添加新的 let 属性,例如 formulaArrayR1C1

于 2009-10-22T00:06:38.900 回答
1

我认为您需要为公式指定第一个单元格,即使您将公式应用于整个选择:

range_res("A1").FormulaArray = "=(IF((IF(Sheet4!A1:HM232=1,0,"+ etc
于 2009-06-25T18:25:01.643 回答
1

尝试使用 sumproduct 代替。它具有作为“隐式”数组公式的优点。

myrange.formula = "=sumproduct((logicalExpr1) * (logicalExpr2) * (logicalExpr3))

它还将使您的公式更具可读性。

于 2009-08-05T07:28:21.697 回答
0

就在我的脑海中,你的意思是把公式应用到整个范围吗?

编辑:尝试只设置 Formula 属性而不是 FormulaArray 属性。

于 2009-06-25T18:14:50.833 回答
0

是的,我同意 Robert J. 所以您必须先转换其中一个公式(最好转换为 A1)。幸运的是,有一个功能可以做到这一点,但是你必须每次都运行宏,而不是只使用 Ctrl-Shift-Enter 输入单元格。

于 2009-10-28T16:01:57.873 回答
0

您仍然可以输入 R1C1 格式的公式。试试这种方式:

Private Sub Tryformula()
  Range("B2").FormulaR1C1 = "=RC[-1]+R4C4"
End Sub
于 2010-05-18T18:29:36.683 回答
0

有点旧的线程,但是我对 FormulaArray 的经验(使用 Excel 2010,德语):

正如理查德所提到的,A1 参考风格的复杂公式也不适合我。但是对我来说,R1C1 引用样式并不适用,因为我更喜欢在我的工作表中使用命名引用。以下解决方法对我有用:

Microsoft.Office.Interop.Excel.Worksheet sheet = Globals.ThisAddIn.Application.ActiveSheet;
Microsoft.Office.Interop.Excel.Range range = sheet.Cells[1, 1];
range.Value2 = "=IFERROR(MATCH(INDEX(ForeignTable[ForeignTableField1],MATCH(1,(ForeignTable[ForeignTableField1]=LocalField1)*(ForeignTable[ForeignTableField2]=LocalField2),0)),ForeignTable[ForeignTableField1],0),MATCH(1,(ForeignTable[ForeignTableField3]>=LocalField3)*1,0))"
string formulaArrayString = range.FormulaArray;
range.FormulaArray = formulaArrayString;

当我输出它时,formulaArrayString它包含公式的本地化(德语)版本。当我使用本地化公式时,我没有收到错误。但是,通过使用临时formulaArrayString字符串,我不仅限于本地化的 Excel 版本,而且我总是可以使用英文公式。

于 2014-04-19T22:44:27.797 回答