在vba中隐藏行的更快方法

时间:2016-04-25 15:13:20

标签: excel vba excel-vba

是否有更快或更实用的方法隐藏A列中值为零的所有工作表中的行?我已经设置了多个宏来隐藏行,但这需要大约50-70秒来完成更快的方式?

Sub Macro14()
    Dim c As Range
    For Each c In Sheets("Main").Range("A200:A500")
        If c.value = 0 Then
            Sheets("Main").Rows(c.Row).Hidden = True
        Else
            Sheets("Main").Rows(c.Row).Hidden = False
        End If
    Next
End Sub


Sub Macro15()
    Dim c As Range
    For Each c In Sheets("Elkhart East").Range("A50:A300")
        If c.value = 0 Then
            Sheets("Elkhart East").Rows(c.Row).Hidden = True
        Else
            Sheets("Elkhart East").Rows(c.Row).Hidden = False
        End If
    Next
End Sub


Sub Macro16()
    Dim c As Range
    For Each c In Sheets("Tennessee").Range("A50:A300")
        If c.value = 0 Then
            Sheets("Tennessee").Rows(c.Row).Hidden = True
        Else
            Sheets("Tennessee").Rows(c.Row).Hidden = False
        End If
    Next
End Sub


Sub Macro17()
    Dim c As Range
    For Each c In Sheets("Alabama").Range("A50:A300")
        If c.value = 0 Then
            Sheets("Alabama").Rows(c.Row).Hidden = True
        Else
            Sheets("Alabama").Rows(c.Row).Hidden = False
        End If
    Next
End Sub


Sub Macro18()
    Dim c As Range
    For Each c In Sheets("North Carolina").Range("A50:A300")
        If c.value = 0 Then
            Sheets("North Carolina").Rows(c.Row).Hidden = True
        Else
            Sheets("North Carolina").Rows(c.Row).Hidden = False
        End If
    Next
End Sub


Sub Macro19()
    Dim c As Range
    For Each c In Sheets("Pennsylvania").Range("A50:A300")
        If c.value = 0 Then
            Sheets("Pennsylvania").Rows(c.Row).Hidden = True
        Else
            Sheets("Pennsylvania").Rows(c.Row).Hidden = False
        End If
    Next
End Sub


Sub Macro20()
    Dim c As Range
    For Each c In Sheets("Texas").Range("A50:A300")
        If c.value = 0 Then
            Sheets("Texas").Rows(c.Row).Hidden = True
        Else
            Sheets("Texas").Rows(c.Row).Hidden = False
        End If
    Next
End Sub


Sub Macro21()
    Dim c As Range
    For Each c In Sheets("West Coast").Range("A50:A300")
        If c.value = 0 Then
            Sheets("West Coast").Rows(c.Row).Hidden = True
        Else
            Sheets("West Coast").Rows(c.Row).Hidden = False
        End If
    Next
End Sub

4 个答案:

答案 0 :(得分:2)

使用数组:

Sub t()
    Dim sheetArray() As Variant
    Dim ws&, finalRow&, startRow&
    Dim c As Range

    sheetArray = Array("Alabama", "North Carolina", "West Coast")
    For ws = LBound(sheetArray) To UBound(sheetArray)
        If sheetArray(ws) = "Main" Then
            startRow = 200
            finalRow = 500
        Else
            startRow = 50
            finalRow = 300
        End If
        For Each c In Sheets(sheetArray(ws)).Range("A" & startRow & ":A" & finalRow)
            If c.Value = 0 And Not IsEmpty(c) Then
                Sheets(sheetArray(ws)).Rows(c.Row).Hidden = True
            Else
                Sheets(sheetArray(ws)).Rows(c.Row).Hidden = False
            End If
        Next c
    Next ws    
End Sub

只需添加到该阵列,它应该可以更快地为您工作。如果您有大量工作表,并且不想手动将它们键入VBA代码,则始终可以将数组设置为工作表名称范围,然后从那里开始。如果您需要帮助,请告诉我。

这也假设您不想只是遍历工作簿。如果是这样,您可以For each ws in ActiveWorkbook代替lBound()...

编辑:我添加了一些代码来检查工作表,因此它会正确调整范围。

答案 1 :(得分:2)

这应该以非常快的方式完成:

Sub test()
  Dim x As Variant, i As Long, j(1) As Long, rngVal As Variant, rnghide As Range, rngshow As Range, sht As Object
  For Each sht In ActiveWorkbook.Sheets(Array("Main", "Elkhart East", "Tennessee", "Alabama", "North Carolina", "Pennsylvania", "Texas", "West Coast"))
    Set rnghide = Nothing
    Set rngshow = Nothing
    If sht.Name = "Main" Then
      j(0) = 200
      j(1) = 500
    Else
      j(0) = 50
      j(1) = 300
    End If
    x = sht.Range("A1:A" & j(1)).Value
    For i = j(0) To j(1)
      If x(i, 1) = 0 Then
        If rnghide Is Nothing Then Set rnghide = sht.Rows(i) Else Set rnghide = Union(rnghide, sht.Rows(i))
      Else
        If rngshow Is Nothing Then Set rngshow = sht.Rows(i) Else Set rngshow = Union(rngshow, sht.Rows(i))
      End If
    Next
    rnghide.EntireRow.Hidden = True
    rngshow.EntireRow.Hidden = False
  Next
End Sub

它只是运行整个范围的每个工作表并存储行以显示/隐藏在单独的范围内,然后在一个步骤中更改状态(1表示显示,1表示隐藏每个工作表)

如果您有任何疑问或有任何错误,请告诉我(现在无法测试)

答案 2 :(得分:1)

使用它:

For Each ws In ActiveWorkbook.Worksheets
    For Each c In ws.Range(IIf(ws.Name = "Main", "A200:A500", "A50:A300"))
        ws.Rows(c.Row).Hidden = c.Value = 0
    Next
Next

如果您想要排除工作表Raw,Main和Calendar:

Dim untreatedSheet As Variant
untreatedSheet = Array("Raw", "Main", "Calendar")

For Each ws In ActiveWorkbook.Worksheets
    If Not (UBound(Filter(untreatedSheet, ws.Name)) > -1) Then
        For Each c In ws.Range("A50:A300")
            ws.Rows(c.Row).Hidden = c.Value = 0
        Next
    End If
Next

答案 3 :(得分:0)

如果您选择要过滤的所有工作表,这将有效:

Sub HideRows()

Dim ws As Worksheet

sAddress = "A:A"
    For Each ws In ActiveWindow.SelectedSheets
    ws.Range(sAddress).AutoFilter Field:=1, Criteria1:="<>0"
Next ws

End Sub