功能大大减慢了计算时间

时间:2018-01-31 12:44:38

标签: excel vba excel-vba excel-formula

我有一个excel表格,我正在使用$parts = explode('/', 'abc.com/my+string'); // => Array(2) echo $parts[1] ?? 'not found'; // => string|not found 制作的自定义函数。我必须提到我在单元格中使用这些函数,而不是在宏中。一切正常,但是,我注意到计算时间急剧减慢。说实话,我在大约200个单元格中使用我的功能,但我仍然没有看到它如何能够推断出这样一个内存饥渴的电子表格。我的2个函数也是非常基本的,一个是5个单元格范围内的普通香草VBA(值)搜索(没有二进制或其他快速搜索算法)。另一个函数是修改后的isExist,因此我可以将它用作单元格函数(由于某种原因,dateDiff不会显示为单元格公式)。无论如何,有人可以告诉我为什么vba函数在单元格中作为公式使用会如此耗费内存,我该如何优化它呢?

dateDiff

2 个答案:

答案 0 :(得分:2)

如果没有看到如何使用UDF,我无法完全分析,但代码循环超出范围可能非常慢。例如:

Public Function MyUdf(rng As Range) As Variant
    Dim r As Range
    For Each r In rng
        ' do something that calculates MyUdf
        MyUdf = 1
    Next r
End Function

将检查并处理rng中的每个单元格。如果用户输入的内容如下:

=MyUdf(A:A)

在单元格中,它将处理整列中的每个单元格。

要限制循环的范围,您可以使用以下内容:

Public Function MyUdf2(rng As Range) As Variant
    Dim r As Range, RNG2 As Range
    Set RNG2 = Intersect(rng, rng.Parent.UsedRange)
    For Each r In RNG2
        ' do something that calculates MyUdf
        MyUdf2 = 1
    Next r
End Function

这样你最终可能会处理数千个细胞而不是数百万个细胞。

另一种可能的加速技术是创建VBA数组来处理数据而不是直接使用单元格。

答案 1 :(得分:0)

嗯,默认情况下,Excel VBA中的UDF(用户定义函数)不易变。只有当任何函数的参数发生变化时,才会重新计算它们。只要在工作表上的任何单元格中进行计算,就会重新计算易失性函数。

关闭自动计算

vba performance将计算模式设置为xlCalculationManual,以便在将计算模式更改回xlCalculationAutomatic或运行Application.Calculate之前,不会在Excel工作簿中执行任何计算:

Application.Calculation = xlCalculationManual

关闭屏幕更新

vba performancePrevent Excel更新Excel屏幕,直到此选项更改为True:

Application.ScreenUpdating = False

XLSB格式与XLSM

vba性能提高Excel VBA速度和效率的已知方法,特别是大型Excel文件,是以二进制XLSB格式保存工作簿。