刷新Excel VBA函数结果

80

如何使用户定义函数基于电子表格中更改的数据重新评估自身?

我尝试使用F9Shift+F9

唯一有效的方法似乎是编辑调用函数的单元格,然后按Enter键。

9个回答

136

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

Function doubleMe(d)
    Application.Volatile
    doubleMe = d * 2
End Function
它将在工作簿更改时重新评估(如果您的计算设置为自动)。

20
谢谢,我刚刚因此而感到非常苦恼。需要指出的是,在 Excel 2010 中,你需要将 True 传递给 Application.Volatile,即 Application.Volatile True - mdm
@mdm 感谢您提供的信息!我也需要这个信息来创建 Excel 2013 中的自定义工作表函数! - timbram
2
当我更改单元格的值时,这个方法可以工作,但是我有一个基于填充颜色求和单元格的函数,当我更改单元格的填充颜色时,这个函数不会更新,我必须重新输入值。我能让工作表在我更改填充颜色时实时更新吗? - MilkyTech
@ChrisL,你是否已经找到了基于填充颜色计算的解决方案?期待你的解决方案。 - smartini
@smartini 我从未继续寻找解决方案。我很少使用我的填充颜色函数,所以这并不重要。我希望能够快速回答我4年前的评论,但从未得到答案。也许最好开始一个新问题。如果你这样做了,请在这里留下评论,这样我就可以关注它。 - MilkyTech

45

关于Excel中用于计算的F9键盘快捷键的更多信息

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

18

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


如果你使用的是 Excel 2007,那么这是你唯一的选择,因为 Application.Volatile 方法是在 Office 2010 中添加的。 - I say Reinstate Monica

12

如果您在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

1

要切换到自动模式:

Application.Calculation = xlCalculationAutomatic    

切换到手动模式:

Application.Calculation = xlCalculationManual    

1

这比使用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

1
我发现只有在特定单元格更改时更新计算结果是最好的。以下是示例VBA代码,可放置在“工作表”“更改”事件中:
Private Sub Worksheet_Change(ByVal Target As Range)
  If Not Intersect(Target, Range("F3")) Is Nothing Then
    Application.CalculateFull
  End If
End Sub

1

Application.Volatile无法重新计算包含自定义函数的公式。我使用以下函数:Application.CalculateFull


0
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

请稍微解释一下这段代码,这将大大增加其实用性。 - Trilarion
rng.Formula = rng.Formula 相当于输入单元格并再次按下回车键。它强制Excel重新计算单元格 - 包括任何自定义函数。 - SSlinky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接