VBA根据更改的单元格值隐藏和取消隐藏行

时间:2018-11-16 15:55:15

标签: excel vba excel-vba

我试图根据特定的单元格值在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代码引用单元格中包含公式的更改单元格?

2 个答案:

答案 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 )包含数字值,它就会隐藏行。不管该值是由公式生成还是由硬编码的值生成,脚本都不会在意。