簡體   English   中英

VBA 根據更改的單元格值隱藏和取消隱藏行

[英]VBA Hide and Unhide Rows based on Changing Cell Values

我正在嘗試根據特定的單元格值隱藏/取消隱藏 excel 中的行。 如果值為 0,則所有行都將被隱藏。 如果值為 1,則隱藏第 36 到 1000 行。 如果值為 2,則隱藏 72 到 1000 行,如果值為 3,則隱藏 108 到 100,依此類推,直到可以取消隱藏所有單元格...

這是我到目前為止所擁有的......它適用於隱藏/取消隱藏,但如果我將數字從0更改為1,然后從1更改為2,它有時不會更新......

Private Sub Worksheet_Change(ByVal Target As Range)
     If Target.Address = ("$E$3") And Target.Value = 0 Then
         Sheets("Abutments").Rows("5:1000").EntireRow.Hidden = True
     ElseIf Target.Address = ("$E$3") And Target.Value = 1 Then
        Sheets("Abutments").Rows("36:1000").EntireRow.Hidden = True
     ElseIf Target.Address = ("$E$3") And Target.Value = 2 Then
         Sheets("Abutments").Rows("72:1000").EntireRow.Hidden = True
     Else
         Sheets("Abutments").Rows("5:1000").EntireRow.Hidden = False
     End If
End Sub

如果單元格包含公式,則 VBA 代碼是否可以引用更改的單元格?

您的代碼缺少行被設置回可見的部分,而之前隱藏的部分是可見的。 例如,如果您輸入 1,則第 5...1000 行將被隱藏。 現在,如果您將值更改為 2,您將隱藏第 36...1000 行(但它們已被隱藏),但不會顯示第 5..35 行。

以下代碼計算要隱藏的第一行。 顯示上面的所有行,從該行開始到第 1000 行的所有行都被隱藏。 如果數學與您的需求不完全匹配,則可以輕松更改以適應它。

請注意,如果用戶輸入非數字內容,我使用Val函數來防止運行時錯誤

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address <> "$E$3" Then Exit Sub

    Dim startrow As Long
    If Val(Target.Value) <= 0 Then
        startrow = 5
    Else
        startrow = Val(Target.Value) * 32
    End If

    With Sheets("Abutments")
        If startrow > 5 Then
            .Rows("5:" & startrow - 1).Hidden = False
        End If
        If startrow <= 1000 Then
            .Rows(startrow & ":1000").Hidden = True
        End If

    End With
End Sub

更新我不知道我是否正確理解您的獎金問題。 如果單元格E3包含公式,則其值更改時不會觸發Change事件。 您必須使用Worksheet_Calculate事件實現邏輯,如https://stackoverflow.com/a/11409569/7599798 所述

你幾乎擁有它! 你的邏輯有點不對勁:

作為 KISS 原則的忠實信徒,只需稍微調整一下您的陳述順序即可。 沒必要把這復雜化……

Private Sub Worksheet_Change(ByVal Target As Range)
 Sheets("Abutments").Rows("5:1000").EntireRow.Hidden = False ' Move this to the top
 If Target.Address = ("$E$3") And Target.Value = 0 Then
     Sheets("Abutments").Rows("5:1000").EntireRow.Hidden = True
 ElseIf Target.Address = ("$E$3") And Target.Value = 1 Then
    Sheets("Abutments").Rows("36:1000").EntireRow.Hidden = True
 ElseIf Target.Address = ("$E$3") And Target.Value = 2 Then
     Sheets("Abutments").Rows("72:1000").EntireRow.Hidden = True
 End If
End Sub

只需將最后的 ELSE 語句條件移動到函數的開頭即可。 這將在開始時取消隱藏所有內容,然后根據您的選擇隱藏行。 這將迫使您的腳本每次都重新評估隱藏行的條件,而不必滿足取消隱藏行的條件(這就是為什么您的原始腳本有時只工作的原因)。

編輯:

你的獎金問題已經用這個腳本解決了。 只要單元格的值(在本例中為E3 )包含一個數值,它就會隱藏行。 無論該值是由公式生成還是由硬編碼值生成,腳本都不會關心。

暫無
暫無

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

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