Excel VBA - 高级过滤器 - 突出显示行

时间:2013-12-03 13:45:29

标签: excel vba

我正在尝试使用宏对具有固定列数但行数可变的范围执行高级过滤。然后我想突出显示可见行并清除过滤器。

通过研究,我想出了这个代码:

ActiveSheet.Range("A2:J" & Cells(Rows.Count, 1).End(xlUp)).SpecialCells(xlCellTypeVisible).EntireRow.Interior.Color = 65535

奇怪的是,当我改变了一些过滤条件时,它正在工作但停止了。所以发生了一些我不明白的事情。我现在得到运行时错误1004“应用程序定义或对象定义的错误。”

更多代码/更大代码段:

Sheets("Filters").Activate
Cells.Find(What:="WBS Element", After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Activate
Set CritRange = Range(ActiveCell, ActiveCell.End(xlDown))
Sheets("Data").Activate
DataRange.AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=CritRange

Cells(1, 1).EntireRow.Font.Bold = True

ActiveSheet.Range("A2:J" & Cells(Rows.Count, 1).End(xlUp)).SpecialCells(xlCellTypeVisible).EntireRow.Interior.Color = 65535

ActiveSheet.ShowAllData

2 个答案:

答案 0 :(得分:1)

所以,我在玩具时找到了解决方案。基本上,我使用了一行代码并将其多路复用为我想要做的每一件事。问题似乎来自于我如何设置我的范围...这对我有用:

Range(Cells(2, 1), Cells(Rows.Count, 10)).SpecialCells(xlCellTypeVisible).Interior.Color = 65535

答案 1 :(得分:0)

好的,试试吧。范围分配存在一些问题。您不需要Cells(Rows.Count,1),因为您只关心行#,您可以使用.Rows.Count

我也认为使用对象变量很有用(比如下面的例子中的filterRange)。随着您的前进,它将使您的代码更容易解​​释。

Sub HighlightRows()
Dim filterRange As Range

With ActiveSheet
   '// first define the range
    Set filterRange = _
        .Range("A2:J" & Rows.Count).End(xlUp).SpecialCells(xlCellTypeVisible)
    '// now, manipulate the range as needed
    filterRange.EntireRow.Interior.Color = 65535
End With


End Sub

您应该能够修改它以适合您的子程序,或者您可以将其保存为独立的子程序并按名称调用它,如下所示:

Sub YourSubRoutine()
Sheets("Filters").Activate
Cells.Find(What:="WBS Element", After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Activate
Set CritRange = Range(ActiveCell, ActiveCell.End(xlDown))
Sheets("Data").Activate
DataRange.AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=CritRange

Cells(1, 1).EntireRow.Font.Bold = True

'// Call a subroutine to do the highlighting:
Call HighlightRows

ActiveSheet.ShowAllData

End Sub