乔山办公网我们一直在努力
您的位置:乔山办公网 > excel表格制作 > <em>Excel</em> <em>vba</em>运行太慢,怎么提速

<em>Excel</em> <em>vba</em>运行太慢,怎么提速

作者:乔山办公网日期:

返回目录:excel表格制作


看了你的代码,很奇怪,一共zhidao100行,3列数值,为什么要一个单元格,一个单元格去检查,
而且还是分段定义变量,大约看懂了,只是做法看不懂!
主要是想查找是不是有单元格是负数?或者和是负数!

不行就发个文件上来,我帮你吧,
不然就私信我吧,这上面不让发联系方式的!

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

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

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

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


如图,某个excel文件,数据内容不多。 但是文件本身却变得很大,打开很慢。别的EXCEL文件打开很快打开,这有这个文zhidao件打开需要20秒左右,另外在这个文件中进行其他操作例如查找替换等操作时候,处理起来也很慢。

导致此现象的原因一般是不小心添加了一些不可见的自选图形等对象。我们使用以下的方法来完成检查。点编辑菜单中的定位命令。或者直接按快捷键CTRL+G,或者按F5

弹出定位对话框,在下方点击定位条件。

继续弹出定位条件对话框,在其中选择“对象”,然后点确定按钮

如果发现类似图中,多个圆点的状况,说明文件中有对象。在这种情况下按DELETE删除,保存即可。
造成这个情况的原因,一般是因为最初需要在文件中添加一个对象,由于默认是白色的,不仔细看看不出来。后来由于使用复制粘贴拖动等误操作造成了多个对象占用文件空间。
希望本例子说明对大家有帮助。造成文件过大打开过慢,另外也有可能是公式较多、条件格式等原因造成的。另例说明。

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

第一个e799bee5baa6e4b893e5b19e335简单点,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下如何使用 COUNTA 函数

  • 乔山办公网excel表格制作
  • n = Worksheetfunction.CountA(某工作表.range("A:A"))Set rng = Union(rng, 某工作表.Rows(p)改这2句试试。excel vba如何调用counta语句" src="/uploads/tu/496.jpg" style="width:
  • 求51自学网 <em>Excel</em> <em>VBA</em>基础

  • 乔山办公网excel表格制作
  • 这个问题回答了很多很多回了,兰版的80级是兰版的精典之作,在淘宝,仅46元,视频文件 与示例文件都全。建议您尊重作者的劳动,谢谢希望对你能有所帮助。Excel2003 VBA中,如何查找
  • <em>EXcel</em> <em>vba</em> 运行时总是提示:

  • 乔山办公网excel表格制作
  • 可能是 oldtime 和 newtime 两个类型取Abs的时候类型不对了你zd转下型试试版Cint(oldtime) Cint(newtime) -----------------------------------如果是前一句报错你debug一下看循环到多少出错的并且看看出错的
  • <em>excel</em> <em>vba</em> 获取文本框的值

  • 乔山办公网excel表格制作
  • 数据弄成这样也真是服了你。录制的宏可不行,要用split分割,再计算VBA,如何取单元格的值?" src="/uploads/tu/535.jpg" style="width: 400px; height: 267px;" />下面这段代码的意百思是应该能度看懂
关键词不能为空
极力推荐

ppt怎么做_excel表格制作_office365_word文档_365办公网