簡體   English   中英

Excel VBA自動隱藏/取消隱藏行-多種單元格選擇

[英]Excel VBA auto hide/ unhide rows - mulitiple cell selection

我試圖根據單元格中選擇的列表值 (是/否) 隱藏/取消隱藏行

場景是有兩個下拉列表(在單元格B1B4 ),當單元格B1的值被選擇為'No' ,則第rows 2 and 3需要隱藏,否則,如果在B1選擇了是,則rows 2 and 3取消隱藏。

同樣,當單元格B4的值選擇為'No' ,則需要隱藏第rows 5 and 6否則,如果在B4選擇了“是”,則第rows 5 and 6取消隱藏。

我有一個有效的代碼(如下所示),但是當我選擇一個不同的下拉選擇時(例如,我最初選擇b1為No,然后轉到B4選擇No),那么我隱藏的行就不再保持隱藏狀態,並顯示行(盡管選擇了“否”)。

我的代碼如下。

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

請注意,我是編碼方面的初學者,並且在學習時會不斷成長。

非常感謝您的幫助。 請讓我知道您需要對所說明的情況進行任何澄清。

謝謝。

我認為您可以簡化它,但是我可能還沒有完全理解您隱藏行的意圖。 如果B1為“否”,則無論B4的值如何,第2行和第3行是否都將保留?

我不確定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

問題出在Cells.EntireRow.Hidden = False 更改B1時,該行首先取消隱藏所有內容(包括第4行和第5行),然后決定是否隱藏第2行和第3行。

永遠不會使用變量rng。

以下內容顯式檢查每個子例程中的相關單元格。 但是,如果您的計算量If Target.Address <> Range("B1").Address Then Exit Sub ,則可能需要包括If Target.Address <> Range("B1").Address Then Exit Sub從實現中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菜單中單擊“調試”->“切換斷點”(或F9)。 然后運行宏,調試器將在該行代碼處停止。 您可以通過將變量懸停在變量上,單步執行代碼或移出子變量來檢查變量。 在您不確定導致問題的原因之類的情況下非常有用。

編輯:SJRs解決方案更優雅,如果您想添加更多范圍來隱藏,它更容易擴展。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM