Excel重新计算顺序-为什么依赖单元格在前一个单元格之前计算?

Excel重新计算顺序-为什么依赖单元格在前一个单元格之前计算?,excel,excel-2010,vba,Excel,Excel 2010,Vba,我对Excel计算顺序有一个奇怪的问题——当设置范围脏时,依赖于计算顺序的单元格在参数值为空的前一个单元格之前计算。有没有办法检测那些“假”电话?这对我来说至关重要,因为我在现实世界的应用程序中运行了一些聪明的业务逻辑,而这些“假”调用破坏了所有逻辑。此外,如果使用RTD注册,这些“假”调用不会将其正确绑定到主题,因此不会通知主题断开连接 Excel 2010/32位最新版本 为了说明问题,我创建了简单函数: Function Fnc(param2 As String) As String

我对Excel计算顺序有一个奇怪的问题——当设置范围脏时,依赖于计算顺序的单元格在参数值为空的前一个单元格之前计算。有没有办法检测那些“假”电话?这对我来说至关重要,因为我在现实世界的应用程序中运行了一些聪明的业务逻辑,而这些“假”调用破坏了所有逻辑。此外,如果使用RTD注册,这些“假”调用不会将其正确绑定到主题,因此不会通知主题断开连接

Excel 2010/32位最新版本

为了说明问题,我创建了简单函数:

Function Fnc(param2 As String) As String
    Fnc = Application.ThisCell.Address
    Debug.Print (Application.ThisCell.Address & " - " & param2)
End Function
和程序:

Sub SetDirty()
    Range("B1:C1").Dirty
End Sub
和简单表格:

$A$1=fnc(A1)=fnc(B1)

进入单元格A1、B1、C1

结果很明显:

$A$1$B$1$C$1

如果我重新计算(CTRL+Alt+Shift+F9),我会得到如下结果:

$B$1-$A$1

$C$1-$B$1

但是,有趣的部分来了。如果我运行SetDirty:


$C$1-单元格通常会被重新计算多次:Excel从一个重新计算序列开始,该序列是所有修改单元格的上一个计算序列加上后进先出(后进先出)。 这会导致调用函数并指定未计算的单元格-稍后会再次调用这些函数。
您可以使用IsEmpty检测UDF中未计算的细胞

有关UDF和检测未计算单元格的详细信息,以及Excel计算顺序的详细信息,请参见。

顺便说一句,注意范围。脏-这有点问题。

此页面:,以及同一站点的其他人,应该会回答您的问题。它的作者也是Satckoverflow的常客。我不清楚你把什么放在哪个Excel单元格中-你可以截图或者澄清一下你的例子吗?@brettdj正如我在帖子中所说:$a$1=fnc(A1)=fnc(B1)放在A1、B1、C1单元格中,简单如图所示that@amas你没那么说。你说“$A$1=fnc(A1)=相应单元格中的fnc(B1)”,但没有提到A1、B1和C1。如果您需要我们的帮助,那么在请求时保持清晰,特别是在后续请求时,如果我们要求,那么保持清晰比在一开始就含糊其辞地错误地声称自己清楚要好得多。我使用的是C#,如果cell HasFormula,检查null值是否足够?我不使用C#(仅使用VBA、VB6和C++)所以我无法回答这个问题:尝试一些测试,看看Value是否为null,并检测空单元格。为什么不直接使用IsEmpty?IsEmpty是VBA函数。Excel从不从公式中传递null。空值只能在两种情况下使用:单元格为空或公式未计算。如果我错了,请纠正我。我同意关于Range.Dirty的警告-在这种情况下,带有空白参数的混乱额外调用是由Range.Dirty调用引起的。这与未计算的单元格无关。您可以通过C#Interop使用IsEmpty来检测从Range.Value检索的对象是否为空。看到我给你的推荐信了吗