[英]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.