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并不是真正的空白。