Excel 2010计算何时没有更改

时间:2015-10-14 21:52:32

标签: excel excel-2010

我有一个Excel 2010工作簿,坚持每次进入时“计算”,然后退出单元格(空白),即使没有任何更改。

如果上面的工作簿已打开,则会将问题传播到任何其他已打开的工作簿。当上述工作簿关闭时,问题将消失。

有问题的工作簿包含3张表格; 1有一个使用SQL命令提取外部数据的表, 2有各种公式,总结了表1中的数据, 图3具有使用来自Sheet2的数据的各种图表。

有问题的工作簿不包含宏。

我搜索谷歌的高低无济于事,有什么想法吗?

1 个答案:

答案 0 :(得分:0)

由于TODAY function被认为是易失性¹函数,因此在长列和/或公式行中重复使用它是不明智的,特别是在计算密集型数组公式中。计算滞后可以快速建立起来,并且函数的易变性将强制计算周期,只要整个工作簿中的任何内容发生变化,而不仅仅是当实际影响其结果的某些内容发生变化时,非易失性函数的标准就会发生变化。

基于公式的定义名称实际上并不引用任何工作表调用,这非常适合。使用像=DATE(YEAR(TODAY()), MONTH(TODAY()), DAY(TODAY()))之类的东西会适得其反,因为你没有删除易失性的TODAY()函数。但是,VBA可以将硬编码的本机工作表函数写入已定义名称的 RefersTo:。在这种情况下,将使用工作表“DATE function构建当前日期。

  

以下代码属于 ThisWorkbook 代码页。点击 Alt + F11 ,当VBE打开时,在项目浏览器中找到 ThisWorkbook 。如果项目浏览器不可见,请点击 Ctrl + R 或使用下拉菜单选择View►ProjectExplorer。

     

ThisWorkbook Code sheet

     

双击 ThisWorkbook 或右键单击并选择查看代码。将以下内容粘贴到标题为 Book1 - ThisWorkbook(Code)的代码表中。

Private Const dnCURRENT As String = "Current"

Private Sub Workbook_Open()
    'force a Workbook_SheetChange on open to check Current date
    Call Workbook_SheetChange(Worksheets(1), Worksheets(1).Cells(1))
End Sub

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    On Error GoTo no_Current
    With ThisWorkbook.Names(dnCURRENT)
        On Error GoTo bm_Safe_Exit
        If Application.Evaluate(.RefersTo) <> Date Then
            Application.EnableEvents = False
            .RefersTo = "=DATE(" & Year(Date) & ", " & Month(Date) & ", " & Day(Date) & ")"
        End If
    End With

GoTo bm_Safe_Exit
no_Current:
    ThisWorkbook.Names.Add Name:=dnCURRENT, _
                           RefersTo:="=DATE(" & Year(Date) & ", " & Month(Date) & ", " & Day(Date) & ")", _
                           Visible:=True
    Resume
bm_Safe_Exit:
    If CBool(Err.Number) Then _
        Debug.Print Err.Number & ":" & Err.Description
    Application.EnableEvents = True

End Sub

如果要更改已定义名称的名称,请在顶部的私有常量变量声明中执行此操作。点击 Alt + Q 返回工作表。

第一次对任何工作表进行任何更改时,将创建一个名为当前的新工作簿范围的已定义名称。它将有一个RefersTo:使用硬编码的DATE function返回当前系统日期(例如=DATE(2015, 10, 14))。如果当前日期不等于该公式返回的已定义名称值,则使用当前日期写入新公式,这将在所有引用已定义名称的公式上强制执行新的工作簿范围计算周期。

定义的名称当前是可以使用TODAY()函数的任何地方的直接替代品。在实践中,涉及当前的公式将仅每天重新计算一次。下图显示了当您开始将其键入公式时它将如何显示为选项。

Defined Name with Formula in native worksheet formula

¹当整个工作簿中的任何内容发生变化时,不仅在影响其结果的某些内容发生变化时,挥发性函数都会重新计算。 易失性函数的示例包括INDIRECTOFFSETTODAYNOWRANDRANDBETWEENCELLINFO工作表函数的某些子函数也会使它们变得不稳定。