【问题标题】:VBA to show/hide rows based on whether a cell's value is zeroVBA根据单元格的值是否为零来显示/隐藏行
【发布时间】:2018-12-13 18:57:11
【问题描述】:

我有一个 Excel 工作表,我想根据另一个单元格中的值隐藏或取消隐藏某些行。

简而言之:
整个事情应该取决于单元格中的值C2D2E2

如果C2空白 我希望rows 31 to 40 被隐藏,如果它非空白,它们需要可见 .

其他三个单元格相同,始终隐藏/取消隐藏以下 10 行:

D2 --> rows 41 to 50
E2 --> rows 51 to 60

我尝试了这段代码,但它不起作用,我也没有收到任何错误:

Sub Hide_rows()
    If Range("LS!C2") = 0 Then
        Rows("31:40").EntireRow.Hidden = True
    Else
        If Range("LS!D2") = 0 Then
            Rows("41:50").EntireRow.Hidden = True
        Else
            If Range("LS!E2") = 0 Then
                Rows("51:60").EntireRow.Hidden = True
            Else
                If Range("LS!C2") > 0 Then
                    Rows("31:40").EntireRow.Hidden = False
                Else
                    If Range("LS!D2") > 0 Then
                        Rows("41:50").EntireRow.Hidden = False
                    Else
                        If Range("LS!E2") > 0 Then
                            Rows("51:60").EntireRow.Hidden = False
                        Else

                        End If
                    End If
                End If
            End If
        End If
    End If
End Sub

谢谢!

【问题讨论】:

  • 它是如何“不工作”的?这是非常模糊的,没有足够的信息来提供太多帮助。一个好的第一步是单步执行代码(使用 F8)一次一行,检查变量值等,找出问题所在。
  • 为了可读性,我建议你使用ElseIf 语句。
  • 包括缩进在内的正确格式很重要,原因有很多,这是一个很好的例子。使用 F8 运行该过程,应该更容易找到问题所在。另外一个强烈推荐阅读是:Chip Pearson's Debugging VBA。此外,请查看tour(它为您赢得了徽章!)以及“How to Ask”,还阅读了有关包含minimal reproducible example 的信息。 (顺便说一句,欢迎!)
  • @ashleedawg 我有时会看到一些原因,但如果你能指出一些“永远不会”的原因,我将不胜感激。
  • @ashleedawg 没有冒犯

标签: vba excel show-hide


【解决方案1】:

将此 Worksheet_Change 事件驱动子过程放在 LS 工作表的私有代码表(右键单击名称选项卡,查看代码)中,而不是公共模块代码表中。

sub worksheet_change(byval Target as range)
    if not intersect(target, range("C2:E2")) is nothing then
        on error goto safe_exit
        application.enableevents = false
        rows("31:40").entirerow.hidden = isempty(cells(2, "C"))
        rows("41:50").entirerow.hidden = isempty(cells(2, "D"))
        rows("51:60").entirerow.hidden = isempty(cells(2, "E"))
    end if
safe_exit:
    application.enableevents = true
end sub

对 C2:E2 所做的任何更改都将触发此子过程,并且将重新评估这些行的隐藏/未隐藏性质。

【讨论】:

【解决方案2】:

在我看来你只需要以下几行:

With Sheets("LS")
        .Rows("31:40").EntireRow.Hidden = (.Range("C2") = 0)
        .Rows("41:50").EntireRow.Hidden = (.Range("D2") = 0)
        .Rows("51:60").EntireRow.Hidden = (.Range("E2") = 0)
End With

EDIT 根据 Chris 的观点 - 以下内容就足够了:

With Sheets("LS")
        .Rows("31:40").Hidden = (.Range("C2") = 0)
        .Rows("41:50").Hidden = (.Range("D2") = 0)
        .Rows("51:60").Hidden = (.Range("E2") = 0)
End With

【讨论】:

  • 小问题:EntireRow 是多余的,因为您已经指定了整行
  • 非常感谢。我对此很陌生,我会考虑您提供的所有关于如何形成和提出问题的提示。但是,这段代码对我来说非常好用,我很高兴解决了这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 2023-01-17
  • 2016-01-11
  • 2012-07-15
相关资源
最近更新 更多