添加语句以正确隐藏/取消隐藏行

时间:2017-11-17 15:26:56

标签: excel-vba vba excel

我有一些代码会在主题“关闭”时隐藏行。它可以完美地运行,直到我关闭一个新主题。

问题是表格的典型使用会隐藏所有已关闭的主题。因此,当我将一个打开的主题更改为关闭并运行此宏时,它将取消隐藏所有隐藏的主题,但隐藏最新的主题(主要是因为此代码只是来回反转)。

我需要添加一个声明,以便它可以取消隐藏所有隐藏的主题, NOT 隐藏最新的“已关闭”主题。我很难解释,所以我很抱歉。

Set Rng = Range("A11:A1000")
For Each MyCell In Rng
    If MyCell.Value = "Closed" Then
        If MyCell.EntireRow.Hidden = True Then
            MyCell.EntireRow.Hidden = False
        Else
            MyCell.EntireRow.Hidden = True
        End If
        End If
Next MyCell

With ActiveSheet.Buttons("Button 1")
        If .Caption = "Hide" Then
            .Caption = "Show"
        Else
            .Caption = "Hide"
        End If
    End With
End Sub

好的,所以在第一张图片中是我“关闭”主题的一个例子。我只是将“打开”更改为“关闭”并将其标记为绿色。 注意所有以前关闭的主题目前 HIDDEN

Before Show

当我将此宏运行到“显示”时,它将取消隐藏所有隐藏的行,但是现在它将隐藏我刚刚更改为“已关闭”的行,因为它之前未被隐藏。您可以看到,当显示所有内容时,第33行被隐藏。

After Show

1 个答案:

答案 0 :(得分:1)

有几件事:

1)语句MyCell.Value = "Closed"返回一个布尔值(truefalse)。所以你可以这样做(例如):

  MyCell.EntireRow.Hidden = (MyCell.Value = "Closed") 

圆括号是多余的,但它使发生的事情变得更加清晰,因此我将它们包括在内。这只是在值为"关闭"时将行设置为隐藏。很好,很简单。如果值不是"#34;已关闭"然后该行被取消隐藏。您可以将两个布尔语句相乘(或AND)以获得更复杂的结果。 True*False = FalseTrue*True=True

2)要使用按钮,可以考虑先更改标题,然后再对新值做出反应。

将这两个变化结合在一起,您可以执行以下操作:

With ActiveSheet.Buttons("Button 1")
    If .Caption = "Hide" Then
        .Caption = "Show"
    Else
        .Caption = "Hide"
    End If
End With

Set Rng = Range("A11:A1000")
For Each MyCell In Rng
    MyCell.EntireRow.Hidden = (ActiveSheet.Buttons("Button 1").Caption <> "Hide" And MyCell.Value2 = "Closed")
Next MyCell

除了所有令人困惑的布尔值之外,您可以切换到使用自动过滤器攻击您的隐藏/显示,这样您就不必迭代您的大范围:

Sub button_click()
    If ActiveSheet.Buttons("Button 1").caption = "Show" Then
        ActiveSheet.Buttons("Button 1").caption = "Hide"
        Range("A10:A1000").AutoFilter Field:=1, Criteria1:="<>Closed", VisibleDropDown:=False
    Else
        ActiveSheet.Buttons("Button 1").caption = "Show"
        ActiveSheet.AutoFilterMode = False
    End If
End Sub