Скрыть несколько строк в Excel VBA

Скрыть несколько строк в Excel VBA

Я пытаюсь скрыть все строки, содержащие значение "xx" в столбце A и не скрывать строки, содержащие "a" в столбце A. Диапазон от A8:A556. Этот макрос должен запускаться изменением в ячейке C4.

Есть идеи, почему это не работает? Вот текущая попытка:

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Address(True, True) = "$C$4" Then

    If Range("A8:A555").Value = "xx" Then
        Rows("8:555").EntireRow.Hidden = True
    ElseIf Range("A8:A555").Value = "a" Then
        Rows("8:555").EntireRow.Hidden = False

     End If
   End If

End Sub

Спасибо!

РЕДАКТИРОВАТЬ:

Привет, Fixer1234, вот подробности:

  • «xx» и «a» могут не существовать вместе, если макрос работает правильно.
  • Только строки "xx" должны быть скрыты.
  • Значения «xx» не комбинируются со значениями, которые нельзя скрыть.
  • Значения «a» не находятся в сочетании со значениями, которые должны быть скрыты.
  • есть и другие строки, не содержащие «xx» или «a», которые не нужно скрывать (должен ли я добавить «a» к этим столбцам или полностью удалить IfElse?).
  • Строка «xx» содержит другие формулы, пустой результат формулы означает, что строку необходимо скрыть.
  • В строках «a» используется та же формула, но она выдает результат и не должна быть скрыта.

Ошибка выполнения «13»: несоответствие типов, после чего отладка переходит к первому If Range("A8:A555").Value = "xx" Then

решение1

Вы не можете проверить все значения в диапазоне с помощью Range("A8:A555").Value = "xx". Это выдаст ошибку несоответствия типов.

Вам необходимо пройтись по каждой ячейке в диапазоне и проверить по отдельности, Valueравна ли она «xx».

Чтобы код работал быстрее, не скрывайте строки по мере их обнаружения, а создавайте список Rangeскрытых Rangesстрок, а затем скрывайте их все сразу.

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim cel As Range
Dim RangeToHide As Range

    'Test if Target is C4
    If Not Intersect(Target, [C4]) Is Nothing Then
        'Loop through each cell in range and test if it's "xx"
        For Each cel In Range("A8:A555")
            If cel = "xx" Then
                If RangeToHide Is Nothing Then
                    'Initialise RangeToHide because Union requires at least 2 ranges
                    Set RangeToHide = cel
                Else
                    'Add cel to RangeToHide
                    Set RangeToHide = Union(RangeToHide, cel)
                End If
            End If
        Next
        RangeToHide.EntireRow.Hidden = True
    End If
End Sub

решение2

Используйте этот код VBA в качестве стандартного модуля, он поможет вам скрыть все строки, содержащие в столбце XXили .xxA

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Address(True, True) = "$C$4" Then

Dim i As Integer
  Application.ScreenUpdating = False



    For i = 8 To 255

    If Sheets("Sheet1").Range("A" & i).Value = "XX" Or Sheets("Sheet1").Range("A" & i).Value = "xx" Then
    Rows(i & ":" & i).EntireRow.Hidden = True
    End If


    Next i
    End If

    Application.ScreenUpdating = True


End Sub

Примечание.

Нет необходимости использовать какой-либо код для Отображения строк, имеющих aили A, поскольку они уже Видимы. И, прежде всего, используемый код скрывает определенные строки в столбце A.

решение3

Как скрыть отдельные строки!?
Вот как я думаю:

Private Sub CheckBox1_Click()
If CheckBox1 = False Then
    [15:15].EntireRow.Hidden = True
    [3:3].EntireRow.Hidden = True
Else
    [15:15].EntireRow.Hidden = False
    [3:3].EntireRow.Hidden = False
End If

С наилучшими пожеланиями,
Маттиас

Связанный контент