在 Excel VBA 中隐藏多行

在 Excel VBA 中隐藏多行

我试图隐藏 A 列中包含值“xx”的所有行,而不隐藏 A 列中包含“a”的行。范围是 A8:A556。此宏需要通过单元格 C4 中的更改来触发。

知道为什么它不起作用吗?这是当前的尝试:

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Address(True, True) = "$C$4" Then

    If Range("A8:A555").Value = "xx" Then
        Rows("8:555").EntireRow.Hidden = True
    ElseIf Range("A8:A555").Value = "a" Then
        Rows("8:555").EntireRow.Hidden = False

     End If
   End If

End Sub

谢谢!

编辑:

嘿 Fixer1234,详细信息如下:

  • 如果宏正常工作,“xx”和“a”可能不会同时存在。
  • 仅“xx”行必须隐藏
  • “xx”值不能与无法隐藏的值组合。
  • “a”值不与必须隐藏的值组合。
  • 还有其他不包含“xx 或“a”的行不需要隐藏(我应该在这些列中添加“a”还是完全删除 IfElse?)。
  • “xx”行包含其他公式,公式结果为空白意味着该行必须被隐藏。
  • “a”行具有相同的公式,但它会产生结果并且不能被隐藏。

运行时错误‘13’:类型不匹配,然后调试转到第一个 If Range("A8:A555").Value = "xx" Then

答案1

您无法使用 测试范围内的所有值Range("A8:A555").Value = "xx"。它将引发类型不匹配错误。

您需要循环遍历范围内的每个单元格并单独测试其是否Value等于“xx”。

为了使代码运行得更快,不要在检测到行时隐藏它们,而是建立一个RangeRanges隐藏的行,然后一次性隐藏它们。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim cel As Range
Dim RangeToHide As Range

    'Test if Target is C4
    If Not Intersect(Target, [C4]) Is Nothing Then
        'Loop through each cell in range and test if it's "xx"
        For Each cel In Range("A8:A555")
            If cel = "xx" Then
                If RangeToHide Is Nothing Then
                    'Initialise RangeToHide because Union requires at least 2 ranges
                    Set RangeToHide = cel
                Else
                    'Add cel to RangeToHide
                    Set RangeToHide = Union(RangeToHide, cel)
                End If
            End If
        Next
        RangeToHide.EntireRow.Hidden = True
    End If
End Sub

答案2

使用此 VBA 代码作为标准模块,将帮助您隐藏列中具有XX或的所有行。xxA

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Address(True, True) = "$C$4" Then

Dim i As Integer
  Application.ScreenUpdating = False



    For i = 8 To 255

    If Sheets("Sheet1").Range("A" & i).Value = "XX" Or Sheets("Sheet1").Range("A" & i).Value = "xx" Then
    Rows(i & ":" & i).EntireRow.Hidden = True
    End If


    Next i
    End If

    Application.ScreenUpdating = True


End Sub

注意:

无需使用任何代码来取消隐藏具有a或 的行A,因为已经是可见的。最重要的是,使用的代码隐藏了 列 中的特定行A

答案3

我该如何隐藏单独的行?
我的想法是这样的:

Private Sub CheckBox1_Click()
If CheckBox1 = False Then
    [15:15].EntireRow.Hidden = True
    [3:3].EntireRow.Hidden = True
Else
    [15:15].EntireRow.Hidden = False
    [3:3].EntireRow.Hidden = False
End If

致以最诚挚的问候
Mattias

相关内容