如何根据单元格值隐藏行

如何根据单元格值隐藏行

我有一张包含许多公式的工作表,我需要以下操作:当使用此工作表时,如果不同行上的某些单元格填充了除 之外的数字0,则包含 单元格的行将0自动隐藏。每次使用该工作表时,都应该使用不同的值执行此操作。

关于所附示例:

  • 改变的值在列中B
  • DE并且F是每行上的合并单元格
  • 讨论所附的例子:我需要带有 和 的行Text2自动Text 4隐藏Text 5,因为在B列中这些行的值为零。
    在此处输入图片描述

  • 重要提示!- 每次使用工作表时,0列中的行B都是不同的。并非总是相同。此外,此自动化必须仅适用于文档中的特定选择(例如从行45135)。

答案1

这与另一个答案类似,但测试表明,通过在两个事务中完成所有属性更改,性能几乎提高了 1.5 个数量级(70 倍);hideRange.EntireRow.Hidden = True和各一个unhideRange.EntireRow.Hidden = False

文件开头有三个常量,用于指定要隐藏的列、起始行、结束行和值。OP 值已插入。

将以下代码复制到特定的 vba WorkSheet 模块中。此代码将不是从常规模块工作。Alt-F11打开 Visual Basic 编辑器。按Ctrl-R聚焦/打开项目资源管理器窗格。导航到VBAProject(<file name>)Microsoft Excel Objects然后打开Sheet#(<sheet name>)隐藏行所在的 。

Private Sub Worksheet_Calculate()

  ' Hide Rows if row value in watch_Column is hide_On_Value.
  ' watch_Column must include start_on row number (e.g. A1 or C3)

  ' Hidden rows, beyond the range of cells with values, may not
  ' unhide. For speed, only process rows being used <= end_of_watch.
    Const watchColumn = "B45" ' Beginning Cell (row and column) to watch.
    Const endOfWatch = "135" ' Last row. if "", rest of rows in use.
    Const hideOnValue = 0

    Dim hideRange As Range
    Dim unhideRange As Range
    Dim r As Range
    Dim seeRow As Boolean
    Dim watchStart() As String
    Dim lastRow As String
    Dim tmpEnableEvents As Boolean

    Set r = Me.UsedRange ' call and discard to reset LastCell
    With Me.UsedRange
        lastRow = .Row + .Rows.Count - 1
    End With
    If endOfWatch <> "" Then
       If Val(lastRow) > Val(endOfWatch) Then lastRow = endOfWatch
    End If
    watchStart = Split(Me.Range(watchColumn).Address(True, False), "$")
    If Val(watchStart(1)) > Val(lastRow) Then Exit Sub
    tmpEnableEvents = Application.EnableEvents
    Application.EnableEvents = False
    For Each r In Me.Range(watchColumn & ":" & watchStart(0) & lastRow)
        seeRow = True
        If IsEmpty(r) Then
        ElseIf CStr(r.Value2) = vbNullString Then
        ElseIf r = hideOnValue Then
            seeRow = False
            If Not r.EntireRow.Hidden Then
                If hideRange Is Nothing Then
                    Set hideRange = r
                Else
                    Set hideRange = Union(hideRange, r)
                End If
            End If
        End If
        If seeRow And r.EntireRow.Hidden Then
            If unhideRange Is Nothing Then
                Set unhideRange = r
            Else
                Set unhideRange = Union(unhideRange, r)
            End If
        End If
    Next r
    If Not unhideRange Is Nothing Then
        unhideRange.EntireRow.Hidden = False
    End If
    If Not hideRange Is Nothing Then
        hideRange.EntireRow.Hidden = True
    End If
    Application.EnableEvents = tmpEnableEvents
End Sub

常规模块变更

  • 更改子名称。
  • 将所有Me对象更改为特定工作表引用。
    • Worksheets("Worksheet Name")一张工作表的标准。

答案2

我建议最快的方法之一是 VBA(宏)。

笔记,将此代码复制并粘贴到工作表作为标准模块。

Private Sub Worksheet_calculate()

    Application.EnableEvents = False
    Set Rng = Intersect(UsedRange, Range("D:F"))

 If Rng Is Nothing Then GoTo ExitHere

    For Each i In Rng

        If i.Value = 0 Then
            Rows(i.Row).EntireRow.Hidden = True
        Else
            Rows(i.Row).EntireRow.Hidden = False
        End If
    Next i

ExitHere:

    Application.EnableEvents = True
    Exit Sub

End Sub

注意: Range("D:F")是可编辑的,您可以根据需要调整列引用。

相关内容