Скрыть строки на основе нескольких ячеек

Скрыть строки на основе нескольких ячеек

Моя база данных становится огромной, и я пытаюсь сделать вещи немного более управляемыми. Что я в основном пытаюсь сделать, так это:

Если ячейка E:E = "Complete", скрыть соответствующую строку.
Иначе, если ячейка F:F = "Complete", скрыть ту же/соответствующую строку.

Это будет продолжаться в течение 52 недель года, плюс бесконечное количество строк в зависимости от данных.

Я попробовал простой код:

Private Sub Worksheet_Change(check)

    If Range("E:Z") = Complete Then
        Rows("3:7000").EntireRow.Hidden = True
    Else
        Rows("3:7000").EntireRow.Hidden = False
    End If

Это компилируется, но больше ничего не происходит.

Любая помощь будет полезна.

решение1

Хорошо, давайте разберем это подробнее.

Ваши команды обращаются к целым строкам и целым столбцам как к блокам, но они фактически не оценивают текущую ячейку. Текстовое значение в VBA должно быть заключено в двойные кавычки, в противном случае Excel будет ожидать, что это будет именованная переменная или объект.

Насколько я понимаю, вы хотите просмотреть столбцы E–Z для ввода слова «Complete». Событие Worksheet_Change действует на Target, то есть на ячейку, которая была изменена. Чтобы узнать, находится ли ячейка в столбцах E–Z, вы можете проверить, пересекается ли Target с этим диапазоном.

Intersect(Target, Range("E:Z"))

Эта команда возвращает объект диапазона. Если измененная ячейка не находится в указанном диапазоне, ничего не возвращается. Итак, следующая команда немного похожа на двойное отрицание, но мы хотим, чтобы что-то произошло, если объект пересечения находитсянетНИЧЕГО. Это пишет следующее

If Not Intersect(Target, Range("E:Z")) Is Nothing Then
'   do something
End If

Далее вы хотите проверить, является ли значение целевой ячейки "Complete". Возможно, было бы хорошей идеей сделать это нечувствительным к регистру, поэтому обертывание target в a UCaseпозаботится об этом.

If Not Intersect(Target, Range("E:Z")) Is Nothing Then
    If UCase(Target.Value) = "COMPLETE" Then
        ' some code to hide the row
    End If
End If

Код для скрытия строки должен получить номер строки целевой ячейки. Это можно сделать с помощью Target.Row, который затем можно передать команде, Rows()аналогичной той, что вы использовали, но только для строки целевой ячейки.

Rows(Target.Row).EntireRow.Hidden = True

Пока что код будет таким

Private Sub Worksheet_Change(ByVal Target As Range)

If Not Intersect(Target, Range("E:Z")) Is Nothing Then
    If UCase(Target.Value) = "COMPLETE" Then
        Rows(Target.Row).EntireRow.Hidden = True
    End If
End If

End Sub

... и это будет работать для отдельных строк. Но если вы скопируете "Complete" в несколько строк одним махом, целевой объект будет содержать более одной строки, и код необходимо скорректировать, чтобы отразить это. Объявите диапазон с именем cel, а затем выполните цикл по каждому cel в целевом диапазоне. Теперь команды UCase и Rows должны будут обращаться celвместоTarget

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

Dim cel As Range
If Not Intersect(Target, Range("E:Z")) Is Nothing Then
    For Each cel In Target
        If UCase(cel.Value) = "COMPLETE" Then
            Rows(cel.Row).EntireRow.Hidden = True
        End If
    Next cel
End If

End Sub

И вот вам результат.

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