我下面的代码根据相应的单元格值(如果为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
答案 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