Скрыть строку (в списке) на основе раскрывающегося множественного выбора в каждой из строк (а не в одной ячейке) - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть список «действий» в столбце B, и у каждого из них есть раскрывающийся список для статуса в столбце C. Для каждого действия я могу выбрать «Готово, Выполняется, отложено», «Отменено».Я хочу, чтобы строка автоматически скрывалась (без фильтрации) каждый раз, когда я выбираю статус «Отменено» в раскрывающемся меню (находится в той же строке).

Screenshot

Используемый код ниже:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Dim rng As Range
Set rng = Target.Parent.Range("C2:C21")
If Target.Address <> Range("C2:C21").Address Then
    Exit Sub
Cells.EntireRow.Hidden = False
Select Case Range("C2:C21")
    Case "Cancelled":
        Range("2:21").EntireRow.Hidden = True - ***I want to hide only those rows in which "Cancelled" is selected.***
    Case "Done":
        Range("2:21").EntireRow.Hidden = False - ***I want the rows to unhide if either "Done","In progress" or "TBD" is selected.***
End Select

End Sub

Это, вероятно, ужасный код для того, что я хочу сделать ...

Есть идеи, как это улучшить?

Большое спасибо заранее!:)

Сара

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

Это еще одна опция, пропускающая If и Select Case:

Private Sub Worksheet_Change(ByVal target As Range)

    Dim myRng As Range
    Dim myCell As Range
    Set myRng = Range("C2:C21")

    If Not Intersect(myRng, target) Is Nothing Then
        Cells.EntireRow.Hidden = False            
        For Each myCell In myRng
            myCell.EntireRow.Hidden = CBool(myCell = "Cancelled")
        Next myCell            
    End If

End Sub

"Красота" заключается в том, что условие If устранено, а .Hidden назначено для прямой оценкиmyCell = "Cancelled";

Кроме того, код находится на рабочем листе, поскольку используется событие _SelectionChange.Тогда лист parent диапазона может быть опущен, поскольку он принимает лист, в котором находится код.Так что - Target.Parent.Range может быть приятно пропущено.

0 голосов
/ 28 сентября 2018
  1. Объект rng никогда не использовался.
  2. Если вы хотите проверить, находится ли выбор в Range("C2:C21") или нет, используйте функцию Intersect.
  3. Оператор If может быть выполнен без End If, только если он однострочный.В противном случае вы должны поставить End If в конце.
  4. Range("2:21").EntireRow.Hidden означает, что все строки в 2:21 будут скрыты.

Код:

Private Sub Worksheet_SelectionChange(ByVal target As Range)

    Dim rng As Range, cel As Range
    Set rng = target.Parent.Range("C2:C21")

    If Not Intersect(rng, target) Is Nothing Then
        For Each cel In rng
            cel.EntireRow.Hidden = IIf(cel.Value = "Cancelled", True, False)
        Next cel
    End If
End Sub

Я не уверен, установлена ​​версия ниже или нет.На мой взгляд, обычно этот макрос следует запускать только после того, как что-то изменилось, и мы можем только проверить строку, которая была изменена, остальные строки должны остаться в том же состоянии.

Private Sub Worksheet_Change(ByVal target As Range)    
    Dim rng As Range, cel As Range
    Set rng = target.Parent.Range("C2:C21")
    If Not Intersect(rng, target) Is Nothing Then
        target.EntireRow.Hidden = IIf(target.Value = "Cancelled", True, False)
    End If
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...