我在 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
简而言之,我复制了公式,清除范围,然后重写它。