根据单个单元格值隐藏/取消隐藏行的 VBA 代码

根据单个单元格值隐藏/取消隐藏行的 VBA 代码

我不太明白为什么我的代码不起作用。本质上,在单元格 B5 中我有两个选项,“calc_1”和“calc_2”,用户可以通过下拉列表进行选择。

如果选择了 calc_1,我希望显示第 6 行至第 29 行,隐藏第 30 行至第 53 行,如果选择了 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
    
  • 正如 harrymc 在评论中提到的那样,EntireRow 在这种情况下是多余的。

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

相关内容