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 代码中,nextDiapozon
是 Diapozon.Offset(0, 1)
,nonMatch
是 Range("C31")
,相当于 Cells(31, 3)
,rngCompare
是 Range("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 加速的主要内容,如果未能解决你的问题,请参考以下文章