我试图根据特定的单元格值在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
BONUS是否有办法让vba代码引用单元格中包含公式的更改单元格?
答案 0 :(得分:1)
您的代码缺少将行重新设置为可见的部分(以前隐藏的部分)。因此,例如,如果输入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
答案 1 :(得分:0)
您几乎拥有了!您的逻辑略有偏离:
作为对K.I.S.S原则的忠实拥护者,只需对声明的顺序进行一些调整即可。无需过度复杂...
for x in decadeList:
names = get_topName(baby_df, start_year, end_year, sex)
return names
只需将最终的ELSE语句条件移到函数的开头即可。这将在开始时取消隐藏所有内容,然后根据您的选择隐藏行。这将迫使您的脚本重新评估每次隐藏行的条件,而不必满足取消隐藏行的条件(这就是为什么原始脚本有时仅起作用的原因)。
编辑:
您的红利问题已通过此脚本解决。只要单元格的值(在这种情况下为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
)包含数字值,它就会隐藏行。不管该值是由公式生成还是由硬编码的值生成,脚本都不会在意。