簡體   English   中英

根據值隱藏和取消隱藏行

[英]Hide and unhide rows based on a value

我正在嘗試在 Excel 中創建一個調查,並希望根據他們的答案隱藏和取消隱藏行。 例如,如果 D3 = "no" 隱藏行 D4:D10,並且我想在整個過程中多次重復此操作,但要隱藏的行數會發生變化。 所以如果 D3 = "yes" 不隱藏。 然后移動到回答 D5,如果 D5 =“否”隱藏行 D6:D7。 這一直持續下去。

使用worksheet_change()事件。 在您的 VBE 中,雙擊將發生此更改(此單元格)的工作表。 然后輸入:

Private Sub Worksheet_Change(ByVal Target As Range)

    'Detect if the worksheet change was on cell D3
    If Not (Intersect(Target, Range("D3")) Is Nothing) Then
        'Hide rows if the value of D3 is "No"
        Range("D4:D10").EntireRow.Hidden = (Range("D3").Value = "No")
    End If
End Sub

每次在此工作表上發生更改時,都會觸發此子例程,測試更改是否發生在單元格“D2”中,然后根據值切換行的隱藏屬性。

EntireRow范圍對象的Hidden屬性采用TrueFalse值,因此我們可以將其設置為等於條件語句(Range("D3").value = "No")的結果,這將返回TrueFalse大大簡化了您需要編寫的代碼量。

您只需要添加更多If Not (Intersect(Target, Range("whatever")) Is Nothing) Then行來測試您的其他單元格(如D5 )並根據您正在測試的任何值隱藏相應的行細胞。

如果代碼太多(測試所有這些相交),您可以像這樣測試一次相交:

If Not (Intersect(Target, Union(Range("D3"), Range("D5"), Range("D8"))) Is Nothing) Then
    'And then in here your individual lines that toggle the hidden property:
    Range("D4:D10").EntireRow.Hidden = (Range("D3").Value = "No")

    Range("D6:D7").EntireRow.Hidden = (Range("D5").Value = "No")

    ...
End If

最后,因為這個野獸會在任何時候在此工作表上進行任何更改時觸發,您可能希望在子例程運行時關閉事件觸發。 因此,在子例程的頂部關閉enableEvents ,並在末尾將其重新打開:

Private Sub Worksheet_Change(ByVal Target As Range)

    Application.EnableEvents = False

    If Not (Intersect(Target, Union(Range("D3"), Range("D5"), Range("D8"))) Is Nothing) Then            
        Range("D4:D10").EntireRow.Hidden = (Range("D3").Value = "No")    
        Range("D6:D7").EntireRow.Hidden = (Range("D5").Value = "No")
        Range("D9:D12").EntireRow.Hidden = (Range("D8").Value = "No")    
    End If

    Application.EnableEvents = True

End Sub

這將防止同一子例程在忙於更改工作表時被自己調用,從而導致無限循環並鎖定 excel(如果您在啟動工作簿之前沒有保存工作簿,這很糟糕)。

暫無
暫無

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

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