【问题标题】:Excel VBA Calculate Method not update Array Formulas; showing as #N/AExcel VBA 计算方法不更新数组公式;显示为 #N/A
【发布时间】:2012-02-06 16:54:39
【问题描述】:

我在 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

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

【问题讨论】:

  • 您能否发布您的完整代码 - 看到调整大小会很有用
  • 我添加了resize代码的基础。没什么特别的;我想网上关于如何在线自动调整数组公式大小的讨论有一百零一个?
  • 我可以在 xl2003 中复制您的问题,但有趣的是它在 xl2010 中运行良好。我尝试了强制计算的变体等。最后,我能找到的唯一方法是强制公式立即自行更新,就是让它变得易变,即strFormula = "=LARGE(OFFSET($J$1,0,0,ROW()),1)+ RAND()*0"。 +1 提出一个有趣的问题。你在 xl03 工作吗?
  • @brettdj:感谢您的信息!我实际上使用的是 2007。我以为我在某处读到 OFFSET 应该是一个 volatile 函数,但我猜不是......无论如何,似乎在那里添加一个 RAND() 有助于它在调用计算时更新.我认为这对于我的目的来说是一个合理的解决方法。感谢您的提示!
  • 在 Excel 2016 中仍然存在此问题...感谢 Microsoft。

标签: excel array-formulas vba


【解决方案1】:

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

SendKeys "{F9}"

【讨论】:

    【解决方案2】:

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

    使用此代码

    Dim strFormula As String
    strFormula = "=LARGE(OFFSET($J$1,0,0,ROW()),1)"
    Range("a1:a5").FormulaArray = strFormula
    
    • xl03 提供数字,但需要计算才能正确更新单元格
    • xl07 给出“#N/A”(并在状态栏中引发Calculate
    • 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(其中包括一个测试波动性的文件)

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 感谢您的提示,查尔斯!我认为为了与我正在使用的其他数组公式保持一致,我会暂时尝试使这些公式易变。
      【解决方案4】:

      我记得还有一个Application.CalculateFull 方法——这行得通吗?

      【讨论】:

      • 感谢您的回复。不幸的是,根据我的尝试,Application.CalculateFullApplication.CalculateFullRebuild 都不起作用。我什至尝试先将 Range 标记为 Dirty,但它似乎并没有像我预期的那样工作。 (它仍然显示为#N/A,除非我按 F9 或手动对单元格进行简单的编辑)。
      【解决方案5】:

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

      解决方案:

      在您的公式中使用完全限定的引用。 例如任何类似于 YourFunction(G200:H700) 的公式都应更改为类似于 YourFunction('Your Sheet Name'!G200:H700)

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-25
        • 1970-01-01
        相关资源
        最近更新 更多