mikemcmonagle
mikemcmonagle

Reputation: 35

Dynamically hiding rows with VBA

I have a spreadsheet which hides all rows except those designated by a date and a named region like so:

'Get week no value...
wk = Range("$B$2").Value

'If value changes...
If Target.Address = "$B$2" Then
'Hide all rows/weeks...
Range("allWeeks").Select
Application.Selection.EntireRow.Hidden = True

'...but show week selected by 'wk'
Range(wk).Select
Application.Selection.EntireRow.Hidden = False

All works great. However. Within each named week I have hidden calculation rows defined by "HC" in column A of the row to be hidden. The display of Range(wk) unhides those hidden rows so I introduce a loop to close all the "HC" hidden columns

Dim x As Integer

For x = 1 To 1500
      If Sheet1.Cells(x, 1).Value = "HC" Then
   Sheet1.Rows(x).Hidden = True

    End If
Next

End Sub

The result is that it kinda works but I have to wait several seconds for the process to complete every time I type into a cell which is making the sheet almost unworkable. Any pointers would be appreciated.

Upvotes: 1

Views: 2533

Answers (2)

Marcucciboy2
Marcucciboy2

Reputation: 3263

Generally you want to build up a range of rows to hide within the loop and then afterwards hide that range separately. You can build the range to hide using he Union() function like so:

Option Explicit

Sub HideRows()

    Dim mainRng As Range
    Set mainRng = Range("A2:A" & Range("A" & Rows.count).End(xlUp).Row)

    Dim unionRng As Range

    Dim i As Long
    For i = mainRng.Row To mainRng.Row + mainRng.Rows.count - 1
        If Cells(i, 1).Value2 = "HC" Then
            If Not unionRng Is Nothing Then
                Set unionRng = Union(unionRng, Cells(i, 1))
            Else
                Set unionRng = Cells(i, 1)
            End If
        End If
    Next i

    If Not unionRng Is Nothing Then unionRng.EntireRow.Hidden = True

End Sub

Upvotes: 2

A. M.
A. M.

Reputation: 394

Sometimes when you want to update too many things at once, the UI becomes a bit unresponsive.

I've found that disabling UI updates while doing those changes, speeds things up by an order of magnitude:

Sub XXX()
    ...
    On Error GoTo EH
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    Application.EnableEvents = False
    Application.StatusBar = "I'm working on it..."

' do lots of changes in cells, rows, sheets...

' Undo the accel changes:
CleanUp:
    On Error Resume Next
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    Application.EnableEvents = True
    Application.StatusBar = False
Exit Sub
EH:
    ' Do error handling
    MsgBox "Error found: " & Err.Description
    GoTo CleanUp

End Sub

See https://learn.microsoft.com/en-us/office/vba/api/excel.application.screenupdating and Effect of Screen Updating

Upvotes: 1

Related Questions