刷新 Excel VBA 函数结果

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

我试了 F9ABC1 + F9

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

159734 次浏览

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

你应该在函数的顶部使用 Application.Volatile:

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

然后,当工作簿发生更改时(如果计算设置为自动) ,它将重新计算。

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

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

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

切换到自动:

Application.Calculation = xlCalculationAutomatic

切换到手动模式:

Application.Calculation = xlCalculationManual

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

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

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

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