Excel VBA运行越来越慢,怎么提速

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Excel VBA运行越来越慢,怎么提速相关的知识,希望对你有一定的参考价值。

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

第一个简单点,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

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

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

参考技术A

VBA代码提速常用的方法主要有:


    让代码"专注"运行
    例如:将Application.ScreenUpdating设定为False,关闭屏幕更新
    单元格(区域)写法的选择
    单元格(区域)写法有3种,以A1单元格为例,使用Cell对象写法:cells(1,1),运行速度最快
    使用With语句
    with语句不仅仅是简化了写法,速度也大大提升了。
    尽量不用Variant类型
    这不用多说吧,使用Option Explicit是一个好习惯。

excel版本越高VBA运行速度越慢,为啥?

这跟EXCEL版本要求有关,版本越高,对硬件要求也越高,你的机子没变,版本变了,你就感觉运行慢了。跟VBA没有关系的。 参考技术A 应该是硬件问题,而非软件问题。 参考技术B 可以使用VBA来操作excel内置的功能啊。
如用VBA控制excel自带的数据导入功能来导数据,即保留了vba的自由型和自动化, 也保留了excel内置功能的速度。

以上是关于Excel VBA运行越来越慢,怎么提速的主要内容,如果未能解决你的问题,请参考以下文章

VBA宏运行速度为啥比Excel自带函数慢

excel版本越高VBA运行速度越慢,为啥?

excel版本越高VBA运行速度越慢,为啥?

vba程序从excel表格读取数据(数据量=2000行),程序运行时特别慢,怎么解决?

如下VBA代码 在EXCEL运行时非常慢,有哪位大侠能帮忙解决优化一下。

excel vba 运行速度慢