Excel VBA – For Loop需要很长时间才能执行
我有一个脚本,为了隐藏不包含数据的行而devise,脚本从第7行开始通过A列查找。如果发现不包含值的行,它将隐藏这些行。 不幸的是,这个脚本需要花费1分钟以现在的forms运行在大片上。
有没有人有build议如何重写这个脚本,以使其更快? 它需要在最多5秒内运行
Sub hideAllRows() Dim Checklist As Variant UnlockSheet Call Show_Hide("Row", "7:519", True) Call Show_Hide("Row", "529:1268", True) Checklist = ActiveSheet.Range("A1:A" & Cells(Rows.Count, "A").End(xlUp).Row).Value For I = UBound(Checklist, 1) To LBound(Checklist, 1) Step -1 If Checklist(I, 1) <> "" Then Rows(I & ":" & I).Select Selection.EntireRow.Hidden = False End If Next I
我编辑了你的代码,以使事情变得简单。 其中一个问题是,你的代码是“像疯了似的”触发事件(每次你做一个select,一个事件被触发)。
答:如果你想使用你的代码,我build议你在开始时添加
Application.EnableEvents = False
并在最后一行添加:
Application.EnableEvents = true
B.我build议你在循环结束之后“一击”地隐藏起来。 这里是如何:
Dim Checklist As Variant dim sRowsToHide as string UnlockSheet Application.ScreenUpdating = False Call Show_Hide("Row", "7:519", True) Call Show_Hide("Row", "529:1268", True) Checklist = ActiveSheet.Range("A1:A" & Cells(Rows.Count, "A").End(xlUp).Row).Value For I = UBound(Checklist, 1) To LBound(Checklist, 1) Step -1 If Checklist(I, 1) <> "" Then if sRowsToHide = "" then sRowsToHide = I & ":" & I else sRowsToHide = sRowsToHide & "," & I & ":" & I end if End If Next I ActiveSheet.Range(sRowsToHide).EntireRow.Hidden = True Application.ScreenUpdating = True
你可以使用下面这行来看看这样的事情是如何工作的:
ActiveSheet.Range("2:2,14:14,17:17,19:19").EntireRow.Hidden = True
你可以尝试使用ScreenUpdating,它只会在循环完成时更新表格,而不是每次更新
Dim Checklist As Variant UnlockSheet Application.ScreenUpdating = False Call Show_Hide("Row", "7:519", True) Call Show_Hide("Row", "529:1268", True) Checklist = ActiveSheet.Range("A1:A" & Cells(Rows.Count, "A").End(xlUp).Row).Value For I = UBound(Checklist, 1) To LBound(Checklist, 1) Step -1 If Checklist(I, 1) <> "" Then Rows(I & ":" & I).Select Selection.EntireRow.Hidden = False End If Next I Application.ScreenUpdating = True
以下将隐藏A列中所有具有常量的行(例如, 键入的值 )
Sub hide_A_values() With ActiveSheet.Columns("A") .SpecialCells(xlCellTypeConstants).EntireRow.Hidden = True End With End Sub
这下一个将隐藏具有列A中的公式的所有行
Sub hide_A_values() With ActiveSheet.Columns("A") .SpecialCells(xlCellTypeFormulas).EntireRow.Hidden = True End With End Sub
最后,这将隐藏在列A中具有常量(例如键入的值 )或公式的所有行。
Sub hide_A_values() With ActiveSheet.Columns("A") Union(.SpecialCells(xlCellTypeConstants), .SpecialCells(xlCellTypeFormulas)).EntireRow.Hidden = True End With End Sub
问题是,你必须提供错误控制或处理可怕的Runtime error: 1004 No cells were found
风险Runtime error: 1004 No cells were found
如果没有常量或公式隐藏。 On Error Resume Next
典型的照顾这一点。
Sub hide_A_values() With ActiveSheet.Columns("A") On Error Resume Next .SpecialCells(xlCellTypeConstants).EntireRow.Hidden = True .SpecialCells(xlCellTypeFormulas).EntireRow.Hidden = True On Error GoTo 0 End With End Sub
那些没有被覆盖的唯一情况是返回空string的公式(例如“”),这些空string并不是真正的空白。