2

我在 Excel 中有一系列相互关联的数组公式。这些会自动调整大小以适应通过专有 Excel 插件生成的一系列数据。

但是,每当我的代码将某些数组公式重写为正确的新大小时,单元格都会显示为 #N/A,直到您在工作表上编辑另一个不相关的单元格、保存工作表或按 F9。

使用 Application.Calculate、ActiveSheet.Calculate 等代码没有任何效果。

但是,使用 SendKeys "{F9}" 可以。

例如,这些是工作表上的两个公式:

={IF(LEN(INDEX(A:A, ROW()))>0,ROW(A:A)+2)}

={LARGE(OFFSET($J$1,0,0,ROW()),1)}

第一个公式在以编程方式写入一系列单元格后工作正常。它只是告诉我包含文本的单元格的行号。

第二个公式在以编程方式写入一系列单元格后不起作用。它给了我以前在数字列表中看到的最大行号(这是第一个公式的输出)。如果我按 F9,第二个公式会正确更新。如果我在 VBA 中执行 Application.Calculate,则不会发生任何事情。我还尝试了工作表级别可用的各种其他重新计算方法,但没有运气。

有没有人遇到过这样的事情?

编辑: 调整大小的代码基本上可以归结为这样的东西(剥离所有支持代码,使我可以对其进行更通用的调用):

首先,我这样做:

formula = dataSheet.Cells(startRow, startColumn).formula

然后后来:

Set DeleteRange = dataSheet.Range(dataSheet.Cells(startRow, startColumn), dataSheet.Cells(bottomBound, rightBound))
DeleteRange.ClearContents
Set DeleteRange = Nothing

然后稍后:

Set resultRange = dataSheet.Range(dataSheet.Cells(startRow, startColumn), dataSheet.Cells(startRow + Height - 1, startColumn + Width - 1))
resultRange.FormulaArray = formula
Set resultRange = Nothing

简而言之,我复制了公式,清除范围,然后重写它。

4

5 回答 5

3

如果你不能打败他们,就加入他们。

SendKeys "{F9}"
于 2012-02-06T21:56:41.497 回答
2

鉴于您已经实施了这种方法,我已经充实了我上面的评论

使用此代码

Dim strFormula As String
strFormula = "=LARGE(OFFSET($J$1,0,0,ROW()),1)"
Range("a1:a5").FormulaArray = strFormula
  • xl03 给出数字,但需要计算才能正确更新单元格
  • Calculatexl07 给出“#N/A”(并在状态栏中引发 a )
  • xl10 工作正常

正如您指出的那样,没有任何计算选项,包括完整的依赖树重建工作

使用我RAND上面的建议确实会强制更新 xl07

Dim strFormula As String
strFormula = "=LARGE(OFFSET($J$1,0,0,ROW()),1)+ RAND()*0"
Range("a1:a5").FormulaArray = strFormula

OFFSET是一个 volatile 函数,请参阅Voltatile Excel Functions(其中包括一个测试波动性的文件)

也许查尔斯威廉姆斯可以对此有所了解,我会联系他

于 2012-02-08T02:45:17.937 回答
1

看起来像 2003 年和 2007 年的 FormulaArray 错误。
更简单的公式绕过方法是使用 Range("a1:A5").Formula 而不是公式数组,因为 =LARGE(OFFSET($J$1,0,0,ROW( )),1) 不需要是数组公式

于 2012-02-08T11:05:18.873 回答
0

我的回忆是还有一种Application.CalculateFull方法——这行得通吗?

于 2012-02-06T17:01:05.210 回答
0

在修改了它们所依赖的范围后,我的单元格也没有刷新。我还不得不手动编辑每一个让他们重新计算。

解决方案:

在您的公式中使用完全限定的引用。例如,任何看起来像这样的公式YourFunction(G200:H700)都应该变成这样YourFunction('Your Sheet Name'!G200:H700)

自动刷新现在非常适合我。

于 2013-05-28T19:59:09.223 回答