【问题标题】:Adding a statement to correctly hide/unhide rows添加语句以正确隐藏/取消隐藏行
【发布时间】:2017-11-17 15:26:55
【问题描述】:

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

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

我需要添加一个语句,以便取消隐藏所有隐藏的主题,并且隐藏最新的“已关闭”主题。我很难解释,所以我很抱歉。

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

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

当我将这个宏运行到“显示”时,它会取消隐藏所有隐藏的行,但是它现在会隐藏我刚刚更改为“已关闭”的行,因为它之前没有被隐藏。可以看到,全部显示后,第 33 行被隐藏了。

【问题讨论】:

  • 具体问题是什么?您是否要求为您完成工作?
  • 你如何确定最新的“关闭”主题是什么?
  • 另外,与其使用ifs,不如写MyCell.EntireRow.Hidden = Not MyCell.EntireRow.Hidden
  • 我在我的 OP 中添加了更多带有图像的描述。这个宏只是将所有“关闭”的单元格的值设置为隐藏或不隐藏(与它们相反),我需要用“显示”取消隐藏所有单元格并用“隐藏”隐藏“关闭”单元格隐藏”

标签: excel vba


【解决方案1】:

有几点:

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

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

括号是多余的,但它使发生的事情更清楚,因此我将它们包括在内。这只是在值“关闭”时将行设置为隐藏。很好很简单。如果该值不是“已关闭”,则该行未隐藏。您可以将两个布尔语句相乘(或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

【讨论】:

  • 太棒了!非常感谢。我有一些东西要从最后一行代码中学习,因为我不完全理解它,但它完美无缺。
  • 我已经更新了答案以取消布尔值和 for 循环。您可能想考虑只使用自动过滤器。这比迭代和隐藏要快 TON,而且看起来更容易。
  • 这更有意义,也更容易。不敢相信我一开始就没有考虑到这一点。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-21
  • 2020-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多