根據單一儲存格值隱藏/取消隱藏行的 VBA 程式碼

根據單一儲存格值隱藏/取消隱藏行的 VBA 程式碼

我不太明白為什麼我的程式碼不起作用。本質上,在儲存格 B5 中,我有兩個選項:“calc_1”和“calc_2”,使用者可以透過下拉清單進行選擇。

如果選擇了 calc_1,我希望顯示第 6 至 29 行,隱藏第 30 至 53 行,反之亦然。下面是我寫的程式碼:

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

相關內容