繁体   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