刷新Excel VBA函数结果

刷新Excel VBA函数结果

Refresh Excel VBA Function Results

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

我尝试了F9Shift + F9

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


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

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

然后,只要工作簿发生更改,它将重新评估(如果您的计算设置为自动)。


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

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


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


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

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

您也可以使用Application.Volatile,但这具有使UDF始终重新计算的缺点-即使在不需要时也是如此,因为引用的数据没有更改。

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

切换到自动:

1
Application.Calculation = xlCalculationAutomatic

要切换到手动:

1
Application.Calculation = xlCalculationManual

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

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


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


这比Range(A:B).Calculate更好地刷新了计算:

1
2
3
4
5
6
7
8
9
10
11
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
2
3
4
5
6
7
8
9
10
11
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

推荐阅读