刷新 Excel VBA 函数结果

Posted

技术标签:

【中文标题】刷新 Excel VBA 函数结果【英文标题】:Refresh Excel VBA Function Results 【发布时间】:2008-08-14 13:54:43 【问题描述】:

如何让用户定义的函数根据电子表格中更改的数据重新评估自己?

我试过 F9Shift+F9

似乎唯一可行的方法是使用函数调用编辑单元格,然后按 Enter。

【问题讨论】:

【参考方案1】:

您应该在函数顶部使用Application.Volatile

Function doubleMe(d)
    Application.Volatile
    doubleMe = d * 2
End Function

它会在工作簿更改时重新评估(如果您的计算设置为自动)。

【讨论】:

谢谢,我只是因为这个而把头撞在桌子上。应该指出,在 Excel 2010 中,您需要将 True 传递给 Application.Volatile,即 Application.Volatile True @mdm 感谢您提供关于 True 的信息! Excel 2013 中的自定义工作表函数也需要这个!! 这在我更改单元格的值时有效,但是我有一个根据填充颜色对单元格求和的函数,当我更改单元格的填充颜色时,这不会更新函数,我必须重新输入值。我可以在更改填充颜色时实时更新工作表吗? @ChrisL 您是否为您的用例找到了基于填充颜色计算的解决方案?感谢您的解决方案。 @smartini 我从未继续寻找解决方案。我没有经常使用我的填充颜色功能,这并不重要。我希望 4 年前对我的评论有一个快速的答复,但它从来没有来过。也许最好开始一个新问题。如果你这样做了,请在此处给我留言,以便我关注它。【参考方案2】:

有关在 Excel 中计算的 F9 键盘快捷键的更多信息

F9 重新计算所有打开的工作簿中的所有工作表 Shift+ F9 重新计算活动工作表 Ctrl+Alt+ F9 重新计算所有打开的工作簿中的所有工作表(完全重新计算) Shift + Ctrl+Alt+ F9 重建依赖树并进行完全重新计算

【讨论】:

【参考方案3】:

好的,我自己找到了这个。您可以使用 Ctrl+Alt+F9 来完成此操作。

【讨论】:

如果您将 Excel 2007 视为在 Office 2010 中添加了 Application.Volatile 方法,这是您唯一的选择。【参考方案4】:

如果您在 UDF 参数列表中包含对电子表格数据的所有引用,则每当引用的数据发生更改时,Excel 都会重新计算您的函数:

Public Function doubleMe(d As Variant)
    doubleMe = d * 2
End Function

您也可以使用Application.Volatile,但这样做的缺点是您的 UDF 总是重新计算 - 即使它不需要,因为引用的数据没有更改。

Public Function doubleMe()
    Application.Volatile
    doubleMe = Worksheets("Fred").Range("A1") * 2
End Function

【讨论】:

【参考方案5】:

切换到自动:

Application.Calculation = xlCalculationAutomatic    

切换到手动:

Application.Calculation = xlCalculationManual    

【讨论】:

【参考方案6】:

Application.Volatile 不适用于使用我自己的函数重新计算公式。我使用以下功能: Application.CalculateFull

【讨论】:

【参考方案7】:

这比Range(A:B).Calculate更能刷新计算:

Public Sub UpdateMyFunctions()
    Dim myRange As Range
    Dim rng As Range

    ' Assume the functions are in this range A1:B10.
    Set myRange = ActiveSheet.Range("A1:B10")

    For Each rng In myRange
        rng.Formula = rng.Formula
    Next
End Sub

【讨论】:

【参考方案8】:

我发现最好只在特定单元格更改时更新计算。这是放置在“工作表”“更改”事件中的示例 VBA 代码:

Private Sub Worksheet_Change(ByVal Target As Range)
  If Not Intersect(Target, Range("F3")) Is Nothing Then
    Application.CalculateFull
  End If
End Sub

【讨论】:

【参考方案9】:
Public Sub UpdateMyFunctions()
    Dim myRange As Range
    Dim rng As Range

    'Considering The Functions are in Range A1:B10
    Set myRange = ActiveSheet.Range("A1:B10")

    For Each rng In myRange
        rng.Formula = rng.Formula
    Next
End Sub

【讨论】:

请稍微解释一下代码。会大大增加实用性。 rng.Formula = rng.Formula 与输入单元格并再次按回车相同。它会强制 Excel 再次计算单元格 - 包括任何自定义函数。

以上是关于刷新 Excel VBA 函数结果的主要内容,如果未能解决你的问题,请参考以下文章

通过 VBA 将 XML 导入 EXCEL 不会刷新

如何刷新数据透视图

EXCEL VBA:循环正在工作,但在打印到 PDF 文件之前不刷新

使用 VBA 刷新单个查询的最佳选择

VBA自动刷新数据透视表

VBA刷新查询然后调整列宽