Показать/скрыть строки в раскрывающемся списке

Я нашел код в Интернете в качестве примера, который я настроил, чтобы показать или скрыть определенные строки в зависимости от выбора, который я выбираю в раскрывающемся списке в моем файле Excel.

Макрос не работает, что бы я ни пытался.

Мой код выглядит следующим образом (также приложен скриншот строк под вопросом 2 (2a - 2d), которые не отображаются/не скрываются) Скриншот документа Excel

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Address = "$F$13" Then
If Range("F13").Value = "Yes" Then
Rows("14:17").EntireRow.Hidden = False
End If

If Range("F13").Value = "No" Then
Rows("14:17").EntireRow.Hidden = True
End If

If Range("F13").Value = " " Then
Rows("14:17").EntireRow.Hidden = True
End If
End Sub

person Jewls567    schedule 01.02.2016    source источник
comment
Прямо сейчас ваш код должен работать, если A) этот код находится на листе, на котором вы хотите его запустить (щелкните правой кнопкой мыши вкладку листа и перейдите к просмотру кода, этот код должен быть там), B) меняется ячейка F13. Что у вас за F13, проверка данных? Вы ожидаете, что строка будет скрыта, если F13 = Нет или [пробел], верно?   -  person BruceWayne    schedule 01.02.2016


Ответы (2)


Отсутствует End If. Я предполагаю, что значение целевой ячейки (F13) необходимо проверить на предмет ее значения. Если указано значение «Да», строка 14:17 должна отображаться, если « » (пробел), она должна их скрыть, а если «Нет», то их также следует скрыть. Другие значения не повлияют на скрытие/отображение строк. Должен быть второй End If перед End Sub, чтобы все приведенные выше операторы if были заключены в проверку адреса.

Также обратите внимание, что этот код должен быть помещен в сам рабочий лист, так как вы хотите подключиться к событию Worksheet_Change.

Попробуйте это в модуле рабочего листа:

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$F$13" Then 'Check if the changed value is indeed in F13

    If Target.Value = "Yes" Then
        ActiveSheet.Rows("14:17").EntireRow.Hidden = False 'Show the rows if the value is Yes
    ElseIf Target.Value = "No" Then
        ActiveSheet.Rows("14:17").EntireRow.Hidden = True 'Hide them when it's No
    ElseIf Target.Value = " " Then
        ActiveSheet.Rows("14:17").EntireRow.Hidden = True 'Or space
    End If

End If
End Sub

Другие замечания:

  • Вместо ActiveSheet вы также можете использовать Me (Me.Rows...). В этом сценарии они, вероятно, делают то же самое. Однако, если вы измените значение на рабочем листе из другого рабочего листа (например, формулы, которая пересчитывает), Me будет ссылаться на измененный рабочий лист, который запускает событие, тогда как activeworksheet повлияет на текущий активный лист.
  • Используйте Target вместо повторной ссылки на Range. Цель — это объект диапазона, который уже находится в памяти. Следовательно, выполнение будет быстрее по сравнению с повторным доступом к рабочему листу.
person Rik Sportel    schedule 01.02.2016
comment
Большое спасибо, это действительно помогло, и теперь код работает правильно на листе! Я переместил код из рабочей книги на Sheet1 (четко показывает, насколько я больше;) и добавил все предложенные изменения вместе с дополнительной отсутствующей строкой End If. Я очень ценю это! - person Jewls567; 01.02.2016

Это хороший пример правильного назначения кода, помогающего выявить проблему. Вам не хватает оператора End IF. Попробуй это:

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Address = "$F$13" Then
    If Range("F13").Value = "Yes" Then
        Rows("14:17").EntireRow.Hidden = False
    End If

    If Range("F13").Value = "No" Then
      Rows("14:17").EntireRow.Hidden = True
    End If

    If Range("F13").Value = " " Then
        Rows("14:17").EntireRow.Hidden = True
    End If
End If
End Sub

Вы также можете использовать:

If Range("F13").Value = ""

вместо

If Range("F13").Value = " "
person sous2817    schedule 01.02.2016
comment
Большое спасибо за вашу помощь, это вернуло меня в нужное русло и помогло заставить код работать! :) - person Jewls567; 01.02.2016