The previous two answers from AJD and user109261 have already provided very good reviews of the code (+1 to both, and the question), so I'll focus only on performance
I did a comparative review between 6 different versions (usual optimization techniques), and found one unexpected result - Union is slow (for this particular task)
.
TestData: 4 Sheets, each with 10,000 rows (x 4); Rows to hide on each: 1,250 (Total 5,000)
Time: 4.311 sec (Ini)
Time: 0.973 sec (IniScreen)
Time: 1.047 sec (RangeOptimized)
Time: 0.791 sec (RangeArray)
Time: 4.641 sec (RangeArrayUnion)
Time: 0.219 sec (AutoFilter)
.
2 Test Subs
Option Explicit
Public Sub TimeAllVersions()
'Total Sheets: Worksheets.Count - 3
Debug.Print "Test Data: 4 Sheets, each with 10,000 rows (x 4), hide: 5,000:" & vbCrLf
HideEachT "Ini"
HideEachT "IniScreen"
HideEachT "RangeOptimized"
HideEachT "RangeArray"
HideEachT "RangeArrayUnion"
HideEachT "AutoFilter"
End Sub
Public Sub HideEachT(ByVal subId As String)
Dim t As Double: t = Timer
Select Case subId
Case "Ini": HideDoubleZeorsIni
Case "IniScreen": HideDoubleZeorsIniScreenOff
Case "RangeOptimized": HideDoubleZeorsRangeOptimized
Case "RangeArray": HideDoubleZeorsRangeArray
Case "RangeArrayUnion": HideDoubleZeorsRangeArrayUnion
Case "AutoFilter": HideDoubleZeorsAutoFilter
End Select
Debug.Print "Time: " & Format(Timer - t, "0.000") & " sec (" & subId & ")"
UnHideAll
End Sub
.
The 6 Versions:
1 - Initial version (to compare, using the same test data)
Public Sub HideDoubleZeorsIni()
Dim lr As Long, i As Long, c As Variant, ws As Worksheet
For Each ws In Worksheets
Select Case ws.Name
Case "Form1", "Form 2", "Form 3" 'Do nothing on these tabs
Case Else 'Else do this
With ws
.Activate
lr = ws.Range("B" & Rows.Count).End(xlUp).Row
For i = 1 To lr
With ws.Range("B" & i)
For Each c In Range("B" & i)
If c.Value <> "All Forms" _
And c.Value <> "Week One All Forms" _
And c.Offset(0, 1).Value = 0 _
And c.Offset(0, 1).Value <> vbNullString _
And c.Offset(0, 2).Value = 0 _
And c.Offset(0, 2).Value <> vbNullString _
Then
Rows(c.Row).Hidden = True
End If
Next c
End With
Next i
End With
End Select
Next ws
End Sub
.
2 - Initial version with Screen Off (surprisingly fast, in spite of the weird nesting)
Public Sub HideDoubleZeorsIniScreenOff()
Dim lr As Long, i As Long, c As Variant, ws As Worksheet
OptimizeApp True
For Each ws In Worksheets
Select Case ws.Name
Case "Form1", "Form 2", "Form 3" 'Do nothing on these tabs
Case Else 'Else do this
With ws
.Activate
lr = ws.Range("B" & Rows.Count).End(xlUp).Row
For i = 1 To lr
With ws.Range("B" & i)
For Each c In Range("B" & i)
If c.Value <> "All Forms" _
And c.Value <> "Week One All Forms" _
And c.Offset(0, 1).Value = 0 _
And c.Offset(0, 1).Value <> vbNullString _
And c.Offset(0, 2).Value = 0 _
And c.Offset(0, 2).Value <> vbNullString _
Then
Rows(c.Row).Hidden = True
End If
Next c
End With
Next i
End With
End Select
Next ws
OptimizeApp False
End Sub
.
3 - Optimized for maintainability (and Screen Off)
Public Sub HideDoubleZeorsRangeOptimized()
Dim ws As Worksheet, lr As Long, r As Long, b As String, c As Variant, d As Variant
Dim bCnd As Boolean, cCnd As Boolean, dCnd As Boolean
OptimizeApp True
For Each ws In Worksheets
Select Case ws.Name
Case "Form1", "Form 2", "Form 3"
Case Else
lr = ws.Range("B" & ws.Rows.Count).End(xlUp).Row
For r = 1 To lr
b = ws.Cells(r, "B").Value2
c = ws.Cells(r, "C").Value2
d = ws.Cells(r, "D").Value2
bCnd = b <> "All Forms" And b <> "Week One All Forms"
cCnd = c = 0 And Len(c) > 0
dCnd = d = 0 And Len(d) > 0
ws.Rows(r).Hidden = (bCnd And cCnd And dCnd)
Next
End Select
Next ws
OptimizeApp False
End Sub
.
4 - Using Arrays
Public Sub HideDoubleZeorsRangeArray()
Dim ws As Worksheet, lr As Long, r As Long, b As String, c As Variant, d As Variant
Dim bCnd As Boolean, cCnd As Boolean, dCnd As Boolean, arr As Variant
OptimizeApp True
For Each ws In Worksheets
Select Case ws.Name
Case "Form1", "Form 2", "Form 3"
Case Else
lr = ws.Range("B" & ws.Rows.Count).End(xlUp).Row
arr = ws.Range("B1:D" & lr).Value2
For r = 1 To lr
b = arr(r, 1)
c = arr(r, 2)
d = arr(r, 3)
bCnd = b <> "All Forms" And b <> "Week One All Forms"
cCnd = c = 0 And Len(c) > 0
dCnd = d = 0 And Len(d) > 0
ws.Rows(r).Hidden = (bCnd And cCnd And dCnd)
Next
End Select
Next ws
OptimizeApp False
End Sub
.
5 - Using Arrays and Union
Public Sub HideDoubleZeorsRangeArrayUnion()
Dim ws As Worksheet, lr As Long, r As Long, b As String, c As Variant, d As Variant
Dim bCnd As Boolean, cCnd As Boolean, dCnd As Boolean, arr As Variant, hid As Range
OptimizeApp True
For Each ws In Worksheets
Select Case ws.Name
Case "Form1", "Form 2", "Form 3"
Case Else
lr = ws.Range("B" & ws.Rows.Count).End(xlUp).Row
arr = ws.Range("B1:D" & lr).Value2
Set hid = ws.Range("B" & lr)
For r = 1 To lr
b = arr(r, 1)
c = arr(r, 2)
d = arr(r, 3)
bCnd = b <> "All Forms" And b <> "Week One All Forms"
cCnd = c = 0 And Len(c) > 0
dCnd = d = 0 And Len(d) > 0
If bCnd And cCnd And dCnd Then Set hid = Union(hid, ws.Range("B" & r))
Next
hid.EntireRow.Hidden = True
End Select
Next ws
OptimizeApp False
End Sub
.
6 - Using AutoFilter
Public Sub HideDoubleZeorsAutoFilter()
Dim ws As Worksheet, b1 As String, b2 As String, lr As Long, fc As Range, hid As Range
OptimizeApp True
For Each ws In Worksheets
Select Case ws.Name
Case "Form1", "Form 2", "Form 3"
Case Else
ws.Rows(1).Insert Shift:=xlDown
lr = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row
Set hid = ws.Cells(lr + 1, "B")
Set fc = ws.Range("B1:B" & lr)
With ws.Range("B1:D" & lr)
b1 = "<>All Forms"
b2 = "<>Week One All Forms"
.AutoFilter Field:=1, Criteria1:=b1, Operator:=xlAnd, Criteria2:=b2
.AutoFilter Field:=2, Criteria1:="=0"
.AutoFilter Field:=3, Criteria1:="=0"
If fc.SpecialCells(xlCellTypeVisible).Cells.Count > 1 Then
Set hid = Union(hid, fc.SpecialCells(xlCellTypeVisible))
.AutoFilter
hid.EntireRow.Hidden = True
End If
End With
ws.Rows(1).Delete Shift:=xlUp
ws.Activate
ActiveWindow.ScrollRow = 1
End Select
Next ws
Worksheets(1).Activate
OptimizeApp False
End Sub
.
Utils
Private Sub OptimizeApp(ByVal speedUp As Boolean)
Application.Calculation = IIf(speedUp, xlCalculationManual, xlCalculationAutomatic)
Application.ScreenUpdating = Not speedUp
Application.DisplayAlerts = Not speedUp
Application.EnableEvents = Not speedUp
End Sub
Public Sub UnHideAll()
Dim ws As Worksheet, lr As Long, r As Long
Dim bVal As Variant, cVal As Variant, dVal As Variant, bCond As Boolean
OptimizeApp True
For Each ws In Worksheets
Select Case ws.Name
Case "Form1", "Form 2", "Form 3"
Case Else
ws.UsedRange.Rows.Hidden = False
End Select
Next ws
OptimizeApp False
End Sub
.
Test Data - Before - All 4 sheets are the same

.
Test Data - After - All test results are the same

0\$\endgroup\$