我有一些代码会在主题“关闭”时隐藏行。它可以完美地运行,直到我关闭一个新主题。
问题是表格的典型使用会隐藏所有已关闭的主题。因此,当我将一个打开的主题更改为关闭并运行此宏时,它将取消隐藏所有隐藏的主题,但隐藏最新的主题(主要是因为此代码只是来回反转)。
我需要添加一个声明,以便它可以取消隐藏所有隐藏的主题, 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 。
当我将此宏运行到“显示”时,它将取消隐藏所有隐藏的行,但是现在它将隐藏我刚刚更改为“已关闭”的行,因为它之前未被隐藏。您可以看到,当显示所有内容时,第33行被隐藏。
答案 0 :(得分:1)
有几件事:
1)语句MyCell.Value = "Closed"
返回一个布尔值(true
或false
)。所以你可以这样做(例如):
MyCell.EntireRow.Hidden = (MyCell.Value = "Closed")
圆括号是多余的,但它使发生的事情变得更加清晰,因此我将它们包括在内。这只是在值为"关闭"时将行设置为隐藏。很好,很简单。如果值不是"#34;已关闭"然后该行被取消隐藏。您可以将两个布尔语句相乘(或AND
)以获得更复杂的结果。 True*False = False
,True*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