VBA EXCEL基于单元格值隐藏行非常慢

时间:2018-11-02 15:37:36

标签: excel vba row hide

我下面的代码根据相应的单元格值(如果为0,则隐藏)隐藏/取消隐藏整个行,并且工作正常。

这是材料列表,并且有一个“完成”按钮。在列表的最后,您按下按钮,任何数量为0的项目都应隐藏此相关行。

工作正常。但是问题在于它非常慢。正如您所看到的,它是400多个行,而从字面上我可以看到这些行消失了。它每秒处理大约20行,这使得在20秒内完成列表。而且列表每隔几个月就会翻一番。

所以问题是-是否有其他方法可以立即或至少比当前速度更快地隐藏相关行?

非常感谢!

隐藏:

import time
from threading import Thread
import datetime
def a():
    for i in range(1,3):
        print 'function a :'+str(i) + ' ' + str(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
        time.sleep(1)
def b():
    for i in range(11,13):
        print 'function b :'+str(i) + ' ' + str(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
        time.sleep(1)

if __name__=="__main__":
    t1=Thread(target=a())
    t2=Thread(target=b())
    t1.start()
    t2.start()

取消隐藏:

Public Sub HideRows()
Dim cell As Range
    For Each cell In ActiveSheet.Range("H18:H469")
    cell.EntireRow.Hidden = (cell.Value = 0 And cell.Value <> "")
Next cell
End Sub

2 个答案:

答案 0 :(得分:4)

我只是按照评论中的内容输入内容。使用联盟收集合格范围并一口气藏起来。我不确定为什么要进行双重测试。 = 0是否足够?或在@ Marcucciby2查询中,您是否打算使用Or?

并且如其他答案所述,您可以通过切换诸如ScreenUpdating,pageBreaks之类的内容并切换至手动计算模式来进行一些优化。

如果可能,请删除该ActiveSheet参考,并使用实际的工作簿和工作表参考。

Option Explicit
Public Sub HideRows()
    Dim cell As Range, unionRng As Range
    For Each cell In ActiveSheet.Range("H18:H469")
        If cell.Value = 0 Then
            If Not unionRng Is Nothing Then
                Set unionRng = Union(unionRng, cell)
            Else
                Set unionRng = cell
            End If
        End If
    Next
    If Not unionRng Is Nothing Then unionRng.EntireRow.Hidden = True
End Sub

答案 1 :(得分:3)

在代码开始时关闭屏幕更新和手动计算。请确保在代码末尾重新打开。

    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    '...your code...
    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True