刷新Excel VBA函数结果

时间:2008-08-14 13:54:44

标签: excel vba excel-vba user-defined-functions

有谁知道我如何获得用户定义的函数来重新评估自己(基于电子表格中更改的数据)?我试过 F9 Shift + F9 ,但那些不是工作。唯一可行的方法是使用函数调用编辑单元格,然后按Enter键。有任何想法吗?我似乎记得能够做到这一点......

9 个答案:

答案 0 :(得分:112)

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

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

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

答案 1 :(得分:35)

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

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

答案 2 :(得分:14)

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

答案 3 :(得分:11)

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

答案 4 :(得分:2)

要切换到自动:

Application.Calculation = xlCalculationAutomatic    

切换到手动:

Application.Calculation = xlCalculationManual    

答案 5 :(得分: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

答案 6 :(得分: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

答案 7 :(得分:1)

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

答案 8 :(得分: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