Excel VBA автоматическое скрытие / отображение строк - выбор нескольких ячеек - PullRequest
0 голосов
/ 08 мая 2018

Я пытаюсь скрыть / показать строки на основе значения списка , выбранного в ячейке (Да / Нет).

Сценарий состоит в том, что есть два раскрывающихся списка (в ячейке B1 и B4), когда значение ячейки B1 выбрано как 'No', тогда rows 2 and 3 необходимо скрыть, если Значение Да выбрано в B1, затем rows 2 and 3, чтобы отобразить.

Аналогичным образом, когда значение Ячейка B4 выбрано как 'No', тогда rows 5 and 6 необходимо скрыть, в противном случае, если значение * выбрано в B4, тогда rows 5 and 6, чтобы отобразить.

У меня есть рабочий код (как показано ниже), но когда я выбираю другой выпадающий список (скажем, я сначала выбрал b1 как Нет, а затем перешел к B4, чтобы выбрать Нет), тогда мои скрытые строки больше не остаются скрытыми, и строки отображаются (несмотря на то, что выбор был выбран как Нет).

Мой код выглядит следующим образом.

Private Sub Worksheet_Change(ByVal Target As Range)
    Worksheet_Change_A Target
    Worksheet_Change_B Target
End Sub  

Private Sub Worksheet_Change_A(ByVal Target As Range)
    Dim rng As Range      
    Set rng = Target.Parent.Range("B1") 
    If Target.Address <> Range("B1").Address Then 
        Exit Sub 
    Cells.EntireRow.Hidden = False
    Select Case Range("B1")   
        Case "Yes": 
            Range("2:3").EntireRow.Hidden = False
        Case "No": 
            Range("2:3").EntireRow.Hidden = True 
    End Select
End Sub  

Private Sub Worksheet_Change_B(ByVal Target As Range)
    Dim rng As Range
    Set rng = Target.Parent.Range("B4") 

    If Target.Address <> Range("B4").Address Then 
        Exit Sub
    Cells.EntireRow.Hidden = False
    Select Case Range("B4")  
        Case "Yes": Range("5:6").EntireRow.Hidden = False
        Case "No": Range("5:6").EntireRow.Hidden = True
    End Select
End Sub

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

Ваша помощь очень ценится. Пожалуйста, дайте мне знать, что вам нужны какие-либо разъяснения относительно объясненного сценария.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Проблема в строке Cells.EntireRow.Hidden = False. При изменении B1 эта строка сначала отображает все (включая строки 4 и 5), а затем решает, скрывать ли строки 2 и 3.

Переменная rng никогда не используется.

Следующее явно проверяет соответствующие ячейки в каждой подпрограмме. Однако, если у вас дорогие вычисления, вы можете включить строку If Target.Address <> Range("B1").Address Then Exit Sub из вашей реализации.

Private Sub Worksheet_Change(ByVal Target As Range)
    Worksheet_Change_A Target
    Worksheet_Change_B Target
End Sub
Private Sub Worksheet_Change_A(ByVal Target As Range)
    Select Case Range("B1").Value
        Case "Yes": Range("2:3").EntireRow.Hidden = False
        Case "No": Range("2:3").EntireRow.Hidden = True
    End Select
End Sub
Private Sub Worksheet_Change_B(ByVal Target As Range)
    Select Case Range("B4").Value
        Case "Yes": Range("5:6").EntireRow.Hidden = False
        Case "No": Range("5:6").EntireRow.Hidden = True
    End Select
End Sub

Я настоятельно рекомендую делать отступы вашего кода, как я показал, для удобства чтения. Я использовал Range("B4").Value, чтобы явно показать, что я использую содержимое ячейки. Наконец, отладчик VBA - ваш друг для отслеживания подобных проблем. Нажмите на строку кода, которая вас интересует (или непосредственно перед ней), затем в меню VBA выберите Debug-> Toggle Breakpoint (или F9). Затем запустите макрос и отладчик остановится на этой строке кода. Вы можете проверить переменные, наведя на них курсор, пройти по коду или выйти из подпрограммы Очень полезно в таких случаях, как ваш, когда вы не уверены, что является причиной проблемы.

Редактировать: решение SJR более элегантно, так как его легче расширять, если вы хотите добавить больше диапазонов для скрытия.

0 голосов
/ 08 мая 2018

Я думаю, что вы можете упростить это таким образом, но я, возможно, не полностью понял ваши намерения скрыть ряды. Если B1 - Нет, строки 2 и 3 должны оставаться скрытыми независимо от значения B4?

Я не уверен, для чего предназначалась переменная rng, но я не думаю, что она вам нужна, и вы можете применить общее правило для скрытия / отображения.

Кроме того, зачем вызывать две другие процедуры (у вас может быть веская причина)?

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Address = "$B$1" Or Target.Address = "$B$4" Then
    'Cells.EntireRow.Hidden = False
    Select Case Target.Value
        Case "Yes": Target.Offset(1).Resize(2).EntireRow.Hidden = False
        Case "No": Target.Offset(1).Resize(2).EntireRow.Hidden = True
    End Select
End If

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...