udf 加速

Posted

技术标签:

【中文标题】udf 加速【英文标题】:Udf acceleration 【发布时间】:2018-08-27 10:30:34 【问题描述】:

有一个 Udf 运行良好,但运行缓慢。 我知道如何加速 Sub:

Application.ScreenUpdating = False

Application.Calculation = xlCalculationManual

Application.EnableEvents = False

这适合 Function 吗? 如果没有,我怎样才能加快 Udf 的速度?

Function Fav(Diapozon As Range) As Long
    Application.Volatile

    Dim n As Long

    For x = 1 To 4
        For y = 0 To 1
            If Diapozon.Value = Cells(31, 3).Value Then
                n = 0
                Exit For
            End If

            If Diapozon.Value = Cells(x + 29, y + 10).Value Or Diapozon.Offset(0, 1).Value = Cells(x + 29, y + 10).Value Then
                n = 1
            End If
         Next y
     Next x

     Fav = n
End Function

【问题讨论】:

我建议的第一件事是放弃Application.Volatile。不像您更改 UDF 中的值,而是 function 会在应用程序窗口中任何工作簿上的任何单元格更改值时重新计算。 为什么要循环播放? Application.match 会做。 ++ 将 Cells(x+29..etc 作为参数而不是硬编码在您的 UDF 中 【参考方案1】:

我同意其中一位 cmets 关于丢失 Application.Volatile 的看法。但是,我将详细说明,而不是评论中的内容。

正如@JvdV 指出的那样,每当任何发生变化时,使用Application.Volatile 都会导致重新计算。这会大大减慢计算(和工作簿,因为打开更多或更大的工作簿)。

但是,我还可以从您的Cells(..., ...).Value 中看到,根据当前 UDF 的编程方式,如果硬编码引用的单元格中的值之一发生更改,它可能不会总是在没有 Application.Volitile 的情况下准确更新。

另一种选择是重新处理 UDF,以将其检查 Diapozon 的范围作为附加输入参数包含在内。通过将这些范围作为参数包含在实际的 UDF 中,它会告诉 Excel UDF 取决于这些范围,并且只要其中一个范围发生变化,就应该重新计算。

例如,在下面的 UDF 代码中,nextDiapozonDiapozon.Offset(0, 1)nonMatchRange("C31"),相当于 Cells(31, 3)rngCompareRange("J30:K33"),相当于您循环通过的单元格:

Function Fav(Diapozon As Range, nextDiapozon As Range, nonMatch As Range, rngCompare As Range,) As Long
    Dim n As Long 'Default start value = 0
    Dim cell_var as Variant

    If Diapozon.Value <> nonMatch.Value then
        For each cell_var in rngCompare
            If Diapozon.Value = cell_var.Value Or nextDiapozon.Value = cell_var.Value Then
                n = 1
            End If
        Next cell_var
    End If

    Fav = n
End Function

【讨论】:

以上是关于udf 加速的主要内容,如果未能解决你的问题,请参考以下文章

MySQL如何在我的查询中加速UDF

利用pandas_udf加速机器学习任务

Pyspark:从 Struct 中识别 arrayType 列并调用 udf 将数组转换为字符串

有没有免费的加速器?

十大加速器排名,游戏加速器哪个好?

讯游加速器可以加速海外抖音吗