我正在尝试使用宏对具有固定列数但行数可变的范围执行高级过滤。然后我想突出显示可见行并清除过滤器。
通过研究,我想出了这个代码:
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
答案 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