Код VBA для скрытия/показа строк на основе значения одной ячейки

Код VBA для скрытия/показа строк на основе значения одной ячейки

Я не совсем понимаю, почему мой код не работает. По сути, в ячейке B5 у меня есть два варианта, "calc_1" и "calc_2", которые пользователь может выбрать через раскрывающийся список.

Я хочу, чтобы строки с 6 по 29 отображались, а строки с 30 по 53 скрывались, если выбран calc_1, и наоборот для calc_2. Ниже приведен код, который я написал:

Private Sub Worksheet_Change(ByVal Target As Range)

    If Range("B5").Value = "calc_1" Then
        Rows("6:29").EntireRow.Hidden = False
        Rows("30:53").EntireRow.Hidden = True
        

    ElseIf Range("B5").Value = "calc_2" Then
        Rows("6:29").EntireRow.Hidden = True
        Rows("30:53").EntireRow.Hidden = False

    End If

End Sub

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

решение1

Изменение и пересечение рабочего листа

  • Код запускался при каждом изменении в рабочем листе. Вам нужно ограничить его запуск только при изменении в ячейке B5...

    If not Intersect(Range("B5"), Target) Is Nothing Then
        ' do your stuff
    End If
    

    ... или как в коде:

    If Intersect(Range("B5"), Target) Is Nothing Then Exit Sub
    
    ' do your stuff
    
  • В данном случае EntireRow избыточен, как отметил harrymc в комментариях.

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    
    Dim iCell As Range: Set iCell = Intersect(Range("B5"), Target)
    If iCell Is Nothing Then Exit Sub
    
    If iCell.Value = "calc_1" Then
        Rows("6:29").Hidden = False
        Rows("30:53").Hidden = True
    ElseIf iCell.Value = "calc_2" Then
        Rows("6:29").Hidden = True
        Rows("30:53").Hidden = False
    'Else ' do nothing
    End If

End Sub

При желании вы можете использовать Select Caseвместо If ElseIf.

Select Case iCell.Value
Case "calc_1"
    Rows("6:29").Hidden = False
    Rows("30:53").Hidden = True
Case "calc_2"
    Rows("6:29").Hidden = True
    Rows("30:53").Hidden = False
'Case Else ' do nothing
End Select

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