【问题标题】:How to hide all Rows that are not highlighted?如何隐藏所有未突出显示的行?
【发布时间】:2015-09-17 06:44:27
【问题描述】:

首先,我是 VBA 编程的初学者。也就是说,这是交易:我有一个代码可以找到并突出显示所有出现的多个关键字(如果你想查看我的代码,它是here)。在这段代码的末尾有以下If 语句:

If Not rng Is Nothing Then
    rng.EntireRow.Interior.ColorIndex = 3
End If

现在我想隐藏未突出显示的行。经过大量研究(参考:12345。)关于如何隐藏行我有了这个想法:

If Not rng Is Nothing Then
    rng.EntireRow.Interior.ColorIndex=3
Else
    rng.EntireRow.Hidden = True
End if

但它根本不起作用。沮丧,因为我认为这确实是一个好主意,所以我创建了一个新的工作簿并尝试创建一个简单的宏来实现我的目标,然后我将它添加到上面描述的搜索和突出显示宏中。现在它看起来像这样:

Sub Test()
Dim i As Integer
Dim ws As Worksheet

    Set ws = Tabelle1

    For i = 1 To 10
        If ws.Rows(i).Interior.ColorIndex = 3 Then
            MsgBox "Super"
        Else
            ws.Rows(i).Hidden = True
        End If
    Next i

End Sub

这个宏有一个问题,当我运行它时,一旦它发现一个未突出显示的行,它将隐藏所有其他独立的行,无论它们是否突出显示。有人可以解释一下我的代码有什么问题导致宏跑掉了。如果有人还可以指出如何使用我之前想法中的Else 语句使其运行,那就太好了!

【问题讨论】:

    标签: vba excel for-loop excel-2010


    【解决方案1】:

    我创建了一个宏来隐藏除突出显示的单元格之外的其他列和行。通过按 F9 键运行宏。 希望对你有用。

    Sub Hide_Columns()
        Dim i, a As Long, s, t As Integer
        If TypeName(Selection) <> "Range" Then Exit Sub
        If Rows(Rows.Count).EntireRow.Hidden Or Columns(Columns.Count).EntireColumn.Hidden Then
            Cells.EntireColumn.Hidden = False
            Cells.EntireRow.Hidden = False
            Exit Sub
        End If
        i = Selection.Rows(1).Row
        a = i + Selection.Rows.Count - 1
        s = Selection.Columns(1).Column
        t = s + Selection.Columns.Count - 1
        Application.ScreenUpdating = False
        On Error Resume Next
        Range(Cells(1, 1), Cells(i - 1, 1)).EntireRow.Hidden = True
        Range(Cells(a + 1, 1), Cells(Rows.Count, 1)).EntireRow.Hidden = True
        ...
    

    来源:Excel hide all columns except selected

    【讨论】:

      【解决方案2】:

      您的第一段代码不会工作。时期。您正在测试变量rng 是否设置为something,如果是的话,您可以使用它(并且确实如此)。如果它没有设置为something(即它的值是Nothing),那么你不能将它用于任何目的,因为rng 没有指向任何东西.你无法隐藏虚无。

      您的第二段代码对我来说很好用。我稍微修改了它以在一个新的空白工作簿中工作, 如下:

      Sub Test()
      Dim i As Integer
      Dim ws As Worksheet
      
          Set ws = Sheets("Sheet1")
      
          For i = 1 To 10 Step 2
            ws.Rows(i).Interior.ColorIndex = 3
          Next
      
          For i = 1 To 10
              If ws.Rows(i).Interior.ColorIndex = 3 Then
                  MsgBox "Super"
              Else
                  ws.Rows(i).Hidden = True
              End If
          Next i
      
      End Sub
      

      对我来说就像一个魅力。

      【讨论】:

      • 这真的很奇怪。因为我发布了你的代码,我的代码也在一个新的工作簿中,它按预期工作。但是在我的另一个工作簿中(就像之前所说的那样,它也是一个完整的新工作簿),它仍然隐藏了第一个未突出显示的行之后的所有行。知道为什么会这样吗?
      • 您可能必须在调试中单步执行您的代码才能查看每行的Interior.ColorIndex 是什么。您可能看到red,但实际的ColorIndex 可能不是3
      • 我只是在调试模式下运行它,它是 3 并且代码工作正常(它没有隐藏第一个非突出显示的行之后的所有行)。这真的很奇怪(错误?),不幸的是花了我很多时间。我会接受您的回答,因为您还帮助我解释了为什么我的第一次尝试没有奏效。非常感谢,已接受答案。
      • 我很欣赏这个复选标记,@HugoCavaliniAgudelo。最好发布您的最终解决方案以帮助他人。要么发布答案,要么将您的原始帖子编辑到解决方案中的添加(不要更改现有问题描述)。
      【解决方案3】:

      问题在于Rows对象的ColorIndex属性返回Null。相反,针对单个单元格测试ColorIndex。在您的情况下,rng 变量应该引用单个单元格(如果我正确阅读了您的代码),因此请测试 rng 的ColorIndex。如果有颜色,请随意回复。

      如果有帮助,请告诉我。

      【讨论】:

        猜你喜欢
        • 2022-10-23
        • 1970-01-01
        • 1970-01-01
        • 2013-06-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多