【问题标题】:Hide rows based on False value根据 False 值隐藏行
【发布时间】:2019-01-02 20:31:49
【问题描述】:

我正在使用 Excel 和 VB 制作一个基于复选框隐藏信息行的工作表。我已经做的是设置一列“U”,以便显示该框是否被选中(真/假)。我需要创建一个宏,以便如果该框为假(未选中),它将被隐藏。这是我目前所拥有的:

Sub HideCells()

   If Range("U2").Value = "False" Then
       Rows("2:2").EntireRow.Hidden = True
   ElseIf Range("U2").Value = "True" Then
       Rows("2:2").EntireRow.Hidden = False
   End If

End Sub

现在这适用于单行,但如何将范围从 U2 扩展到 U2:U300?

谢谢。

【问题讨论】:

  • 你需要一个循环。你试过什么? (注意:您是要检查 U 列中的每个单元格,还是只检查 U2,但从 2:300 隐藏行?)

标签: excel vba


【解决方案1】:

您可以将 Emily 的答案缩减为一行。不要忘记关闭屏幕更新:

Sub HideCells()
    Dim r&
    Application.ScreenUpdating = False
    For r = 2 To 300
        Rows(i).EntireRow.Hidden = Not CBool(Cells(r, "U"))
    Next
    Application.ScreenUpdating = True
End Sub

但最快的方法是使用 AutoFilter。如果您有兴趣,我可以更新答案以包含此代码。

更新 - 更快的方式

如上所述,使用Autofilter 实现隐藏行的方法要快得多:

Sub HideCellsFast()
    
    Dim rngTable As Range    '//Range with header
    Dim rngData As Range     '//rngTable's body
    Dim rngFiltered As Range '//Filtered rows
    
    '// Set original range including header
    Set rngTable = Range("U1:U10")
    '// Get range without header
    With rngTable
        Set rngData = .Offset(1).Resize(.Rows.Count - 1)
    End With
    
    '// Filter rows
    rngTable.AutoFilter Field:=1, Criteria1:=1
    
    '// Use error hanlder since there can be no filtered rows
    On Error Resume Next
    '// Try to get filtered rows
    Set rngFiltered = rngData.SpecialCells(xlCellTypeVisible)
    '// Check if we have filtered rows
    If Err = 0 Then
        '// If we're here, there are filtered rows.
        '// First, remove filter.
        rngTable.AutoFilter Field:=1
        '// Then hide the rows we have filtered
        rngFiltered.EntireRow.Hidden = True
    Else
        '// Do something if we have no filtered rows
    End If
    On Error GoTo 0
    
    '// Other code...

End Sub

【讨论】:

  • 嗨!您可以使用 AutoFilter 更新您的答案吗?我遇到了类似的问题,想看看你的解决方案......
  • @Mirza 以更快的方式更新了我的答案。 ?
  • 谢谢!这也很有用!
【解决方案2】:

为了从第二行到第 300 行进行基本循环,我们定义了一个新变量 I,它将保存当前值/行。然后我们用值 i 替换我们的行引用并在它周围应用一个循环。

Sub HideCells()
 Dim i As Long
For i = 2 to 300
   If Range("U" & i).Value = "False" Then
       Rows(i).EntireRow.Hidden = True
   ElseIf Range("U" & i).Value = "True" Then
       Rows(i).EntireRow.Hidden = False
   End If
 Next i

End Sub

【讨论】:

  • @Emily_Alden 这很完美!非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多