Excel VBA - For Loop耗时太长而无法执行

时间:2015-02-09 04:13:54

标签: excel vba excel-vba

我有一个脚本,我设计的是为了隐藏不包含数据的行,脚本从第7行开始查看列A.如果找到不包含值的行,它将隐藏那些行的视线。不幸的是,这个脚本需要1分钟才能在目前的大型工作表上运行。

是否有人建议如何重写此脚本以使其更快?它需要在最多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

3 个答案:

答案 0 :(得分:2)

我已编辑了您的代码,以使事情变得更简单。 其中一个问题是您的代码正在“疯狂地”触发事件(每次执行Select时,都会触发事件)。

一个。如果您想按原样使用代码,我建议您在开头添加

Application.EnableEvents = False

并添加到最后一行:

Application.EnableEvents = true

B中。我建议你在循环结束后进行“一击”。方法如下:

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

答案 1 :(得分:0)

您可以尝试使用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

答案 2 :(得分:0)

以下内容将隐藏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 foundOn 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

唯一没有涉及的案例是返回空字符串(例如“”)的公式,这些公式不被视为真正的空白。