Excel数据量太大,用VBA运算依然会耗时太久,运行很慢,该怎么办?

Excel数据量太大,用VBA运算依然会耗时太久,运行很慢,该怎么办?,第1张

给你个建议,把所有需要读写工作表的 *** 作,用数组表达,尽量减少读写工作表的语句。

这样让更多的 *** 作在内存中进行,而不是在硬盘上进行。这中间的差异是天壤之别。我原来写的一个提取内容的sub,提取一个填写一个,总用时2分40秒。

然后我把要提取的东西全都赋值给数组,完事以后一次填写一行,或者完事后一下填写完,

结果只用了7秒。

我看出问题了,数据多的时候,隐藏的 *** 作会很慢。加快速度有两个途径:

第一个简单点,for i=11 ti h的循环不要检查cells,而是先把第5列内容存放在数组里面,在数组里面检查是否应当隐藏。进行隐藏的算法也优化了一点,就是先根据是否相等判断出是否隐藏到变量x里面,然后检测那一行的状态是否与x相同,不同才处理,减少处理次数。优化后的代码如下:

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim s, h, i, arr, x

    If Target.Address = Range("P5").Address Then

        s = Range("P5").Value

        h = UsedRange.Rows.Count

        If (Trim(s) = "全部" Or Trim(s) = "") Then

            Rows("10:" & h).Hidden = False

        Else

            Application.ScreenUpdating = False

            arr = Range(Cells(1, 5), Cells(h, 5))

            For i = 11 To h

                x = arr(i, 1) <> s

                If Rows(i).Hidden <> x Then Rows(i).Hidden = x

            Next

        Application.ScreenUpdating = True

        End If

    End If

End Sub

上面的代码通过从数组里面判断,减少了取数时间,隐藏/显示行之前先检测一下状态,减少处理时间,应该有一定的效果。

代码还可以进一步优化,逐行扫描去隐藏和显示的 *** 作仍然非常耗时,进一步优化的思路就是一块一块的进行处理,例如在数万行中筛选出需要显示的只有几行(极端就是一行)而其它都要显示的时候,最最佳状态下只需要执行三次:前面一段隐藏、中间一段显示、后面一段隐藏,能把上万次的表格界面 *** 作缩小到三次,效果会大大加强。但是代码会很长、很复杂,要用一系列变量记录判断的当前行应该隐藏还是显示,但不立即处理,继续判断下一行;如果需要的处理和前面的相同,就记录需要处理的范围,继续下一行判断;如果需要的处理和之前的不同,那就执行之前的 *** 作,重新记录。

VBA程序开始的时候记录一下开始时间,结束的时候把当前时间与记录时间计算差就可以,例如:

Dim tm

tm = Now()

'....宏语句....

MsgBox "耗时:" & Format(Now()-tm, "hh:mm:ss")


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11801297.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存