Excel:Worksheet.Calculate 导致 udf 无限运行

问题描述 投票:0回答:1

我写了一个 udf 返回一个插入到单元格位置的数组。 udf 可以长时间运行,因为它会连接到休息服务以从数据库中获取数据。所以我在功能区上添加了一个按钮来执行此操作。

Sub ReCalc(ribbon As IRibbonControl)
    Dim ws As Worksheet
    ActiveWorkbook.ForceFullCalculation = True
    For Each ws In ActiveWorkbook.Worksheets
        ws.Calculate
    Next
    ActiveWorkbook.ForceFullCalculation = False
End Sub

如果没有 ActiveWorkbook.ForceFullCalculation,worksheet.calculate 不会导致 udf 运行。 如果我简单地执行

Application.CalculateFull
,它会运行 UDF - 但当然也会重新计算其他工作簿。为什么这个有效,而上面的无效?

在调用 UDF 之前,我调用此函数来关闭自动计算和其他一些功能:

Sub BattenTheHatches(on_off As Boolean, Optional msg As String = "")
    Application.EnableEvents = Not on_off
    Application.DisplayAlerts = Not on_off
    If on_off Then
        Application.Calculation = xlCalculationManual
        Application.Cursor = xlWait
    Else
        Application.Calculation = xlCalculationAutomatic
        Application.Cursor = xlDefault
    End If
    'Application.Volatile Not on_off
    Application.ScreenUpdating = Not on_off
End Sub

任何调试和解决此问题的帮助将不胜感激。

excel vba
1个回答
0
投票

问题在于ActiveWorkbook.ForceFullCalculation的使用。因为当您将 ActiveWorkbook.ForceFullCalculation 设置为 True 时,Excel 在每次计算时都会重新计算工作簿中的所有公式,而标记为重新计算的公式现在将不会被计算。在实际操作中,Worksheet.Calculate 将最有效地重新计算标记为重新计算的单元格,但 Application.CalculateFull 将重新计算所有打开的工作簿中的所有公式,这会导致 UDF 行走,即使 Worksheet.Calculate 不运行。

对于这个麻烦,如果需要在调用Worksheet.Calculate时运行UDF,则需要在UDF中使用Application.Volatile方法。

© www.soinside.com 2019 - 2024. All rights reserved.