Добавить скрытие строк в текущий код VBA - PullRequest
0 голосов
/ 27 августа 2018

Я написал код VBA, чтобы скрыть определенные диапазоны в 4 разных вкладках в моей книге. Я ищу, чтобы добавить еще один диапазон к коду, который будет скрывать строки на основе значения ячейки в том же диапазоне на каждой из 4 различных вкладок. Если ячейка в диапазоне B9-B13 пуста, то эту строку на каждой вкладке скрыть.

Вот мой текущий код:

 Sub  HideRowsSummary()
     Dim wsMySheet As Worksheet
     Dim lngMyRow  As Long
     Application.ScreenUpdating = False
     For Each wsMySheet In ThisWorkbook.Sheets
     Select Case wsMySheet.Name
        Case Is = "Summary 1", "Summary (2)",  "Summary (3)", "Summary (4)"
                For lngMyRow = 73 To 24 Step  -1 'Need to work backwards through the rows when hiding or deleting
                    If  Len(wsMySheet.Range("A" & lngMyRow)) = 0 Then
                         wsMySheet.Range("A" & lngMyRow).EntireRow.Hidden = True
                    Else
                         wsMySheet.Range("A" & lngMyRow).EntireRow.Hidden = False
                    End If
                Next lngMyRow
         End Select
     Next wsMySheet
     Application.ScreenUpdating = True
End Sub

Спасибо за внимание!

1 Ответ

0 голосов
/ 27 августа 2018

Например, следующий сразу после вашего предыдущего цикла? Более эффективно использовать Union, чтобы собрать подходящие строки (если все в одном листе) вместе и спрятаться за один раз. Таким образом, вы можете собрать подходящие строки из обоих циклов (вы также можете объединить циклы в них) и скрыть все сразу.

For lngMyRow = 13 To 9 Step -1  'Need to work backwards through the rows when hiding or deleting
    wsMySheet.Range("B" & lngMyRow).EntireRow.Hidden = (wsMySheet.Range("B" & lngMyRow) = vbNullString)
Next lngMyRow

Спасибо @ScottCraner за то, что он указал на очень хорошую стенографию.


Два цикла с объединением диапазонов могут выглядеть (не проверено):

Option Explicit
Public Sub HideRowsSummary()
    Dim wsMySheet As Worksheet
    Dim lngMyRow  As Long, unionRng As Range
    Application.ScreenUpdating = False
    For Each wsMySheet In ThisWorkbook.Sheets
        Select Case wsMySheet.NAME
        Case Is = "Summary 1", "Summary (2)", "Summary (3)", "Summary (4)"
            With wsMySheet
                .Range("A9:A13, A24:A74").EntireRow.Hidden = False
                For lngMyRow = 9 To 13
                    If .Range("B" & lngMyRow) = vbNullString Then
                        If Not unionRng Is Nothing Then
                            Set unionRng = Union(unionRng, .Range("B" & lngMyRow))
                        Else
                            Set unionRng = .Range("B" & lngMyRow)
                        End If
                    End If
                Next lngMyRow
                For lngMyRow = 24 To 73
                    If Len(.Range("A" & lngMyRow)) = 0 Then
                        If Not unionRng Is Nothing Then
                            Set unionRng = Union(unionRng, .Range("A" & lngMyRow))
                        Else
                            Set unionRng = .Range("A" & lngMyRow)
                        End If
                    End If
                Next lngMyRow
            End With
        End Select
        If Not unionRng Is Nothing Then unionRng.EntireRow.Hidden = True
        Set unionRng = Nothing
    Next wsMySheet
    Application.ScreenUpdating = True
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...