我在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
在坚果壳中,我制作公式的副本,清除范围,然后重写它。
答案 0 :(得分:3)
如果你无法击败他们,请加入他们。
SendKeys "{F9}"
答案 1 :(得分:2)
鉴于您已实施此方法,我已充实了上述评论
使用此代码
Dim strFormula As String
strFormula = "=LARGE(OFFSET($J$1,0,0,ROW()),1)"
Range("a1:a5").FormulaArray = strFormula
Calculate
)正如您所指出的,没有任何计算选项,包括完整依赖关系树重建工作
使用上面的RAND
建议会强制更新xl07
Dim strFormula As String
strFormula = "=LARGE(OFFSET($J$1,0,0,ROW()),1)+ RAND()*0"
Range("a1:a5").FormulaArray = strFormula
OFFSET
是一个易变函数,请参阅Voltatile Excel Functions(其中包含测试波动率的文件)
或许查尔斯威廉姆斯可以对此有所了解,我会打电话给他
答案 2 :(得分:1)
在2003年和2007年看起来像一个FormulaArray错误 公式的简单旁路将是使用Range(“a1:A5”)。公式而不是公式数组,因为= LARGE(OFFSET($ J $ 1,0,0,ROW()),1)不需要数组公式
答案 3 :(得分:0)
我的回忆是,还有一个Application.CalculateFull
方法 - 这有效吗?
答案 4 :(得分:0)
我们的细胞在它们所依赖的范围之后也没有刷新。 我还必须手动编辑每一个以重新计算它们。
解决方案:
在公式中使用完全限定的引用。
例如任何看起来像YourFunction(G200:H700)
的公式都应该更改为YourFunction('Your Sheet Name'!G200:H700)
。
自动刷新现在对我来说非常适合。