
Моя база данных становится огромной, и я пытаюсь сделать вещи немного более управляемыми. Что я в основном пытаюсь сделать, так это:
Если ячейка 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
И вот вам результат.