[英]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
屬性采用True
或False
值,因此我們可以將其設置為等於條件語句(Range("D3").value = "No")
的結果,這將返回True
或False
大大簡化了您需要編寫的代碼量。
您只需要添加更多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.