Código VBA para ocultar/mostrar filas según el valor de una sola celda

Código VBA para ocultar/mostrar filas según el valor de una sola celda

No entiendo muy bien por qué mi código no funciona. Básicamente, en la celda B5 tengo dos opciones, "calc_1" y "calc_2", que el usuario puede seleccionar mediante el menú desplegable.

Quiero que se muestren las filas 6 a 29 y que se oculten las filas 30 a 53 si se selecciona calc_1, y viceversa para calc_2. A continuación se muestra el código que escribí:

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

Cuando ejecuto este código, solo se muestran las filas 6 a 29, sin importar la selección que haga. No estoy seguro de lo que me estoy perdiendo aquí.

Respuesta1

Cambio de hoja de trabajo e intersección

  • El código se ejecutaba en cada cambio en la hoja de trabajo. Debe restringirlo para que se ejecute solo cuando se haya producido un cambio en la celda B5...

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

    ... o como en el código:

    If Intersect(Range("B5"), Target) Is Nothing Then Exit Sub
    
    ' do your stuff
    
  • EntireRow es redundante en este caso, como lo mencionó harrymc en los comentarios.

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

Opcionalmente, puedes usar Select Caseen lugar de 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

información relacionada