Excel 将循环更改为自动筛选

Excel 将循环更改为自动筛选,excel,vba,loops,autofilter,Excel,Vba,Loops,Autofilter,我想通过将循环结构更改为自动过滤器结构来简化以下代码 1 ActiveCell.Columns("A:A").EntireColumn.Select If Selection.Find(What:="~* C", After:=ActiveCell, LookIn:=xlValues, _ LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, _ MatchCase:=True)

我想通过将循环结构更改为自动过滤器结构来简化以下代码

1
 ActiveCell.Columns("A:A").EntireColumn.Select
 If Selection.Find(What:="~* C", After:=ActiveCell, LookIn:=xlValues, _
        LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, _
        MatchCase:=True) Is Nothing Then
    GoTo 2
 End If

 Selection.Find(What:="~* C", After:=ActiveCell, LookIn:=xlValues, _
        LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, _
        MatchCase:=True).Activate
 ActiveCell.Select
 Range(Selection, Selection.Offset(0, 1)).Insert shift:=xlToRight
 GoTo 1
2
试试这个:

Sub test()
    Dim lastrow As Long
    Dim rng As Range
    Dim ar As Range
    'change Sheet1 to suit
    With ThisWorkbook.Worksheets("Sheet1")            
        lastrow = .Cells(.Rows.Count, "A").End(xlUp).Row 'find last row in column A            
        .AutoFilterMode = False 'remove previous filter          
        With .Range("A1:A" & lastrow)                
            .AutoFilter Field:=1, Criteria1:="*~* C*" 'apply filter   

            On Error Resume Next
            Set rng = .Offset(1).Resize(.Rows.Count - 1).SpecialCells(xlCellTypeVisible) 'find visible rows
            On Error GoTo 0
        End With                        
        .AutoFilterMode = False 'remove filter
        'if we found some values - insert
        If Not rng Is Nothing Then 
            rng.Insert Shift:=xlToRight
            rng.Insert Shift:=xlToRight
        End If
    End With
End Sub
如果列A不包含标题,请将此列用于
rng

Set rng = .SpecialCells(xlCellTypeVisible)

顺便说一句,这篇文章将来可能会对你有所帮助:

一旦应用了过滤器,我通常会使用以下方法:

dim rng as range
set rng = ActiveSheet.cells.SpecialCells(xlCellTypeVisible)
这将获取所有可见的单元格,这些单元格在过滤器处于活动状态时,仅是与过滤器条件匹配的单元格

编辑 开始时,请执行以下操作:

dim numrows as long
dim numcolumns as long 

numrows = Cells.find("*", [A1], , , xlByRows, xlPrevious).Row
numcolumns = Cells.find("*", [A1], , , xlByColumns, xlPrevious).Column
然后在过滤之前执行此操作:
set rng=Range(“A1”,单元格(numrows,numcolumns))


然后在筛选之后,使用以下方法代替Activesheet:
设置rng=rng.cells.SpecialCells(xlCellTypeVisible)
,这样它就可以只获取所用范围内的可见单元格了

这几乎行得通!是否有办法将“rng”设置为仅高亮显示包含值的可见单元格?现在它突出显示了工作表中的所有单元格。在我使用Offset命令之前,这非常有效。“rng=rng.Cells.SpecialCells(xlCellTypeVisible)”仍然是选择整个工作表的选项。是否可以在代码中的某个位置添加“>0”?过滤器的作用是显示特定列满足特定条件的所有行。。但过滤器显示整行。过滤器不显示特定的单元格。因此,范围得到的是过滤器显示的所有行。但同样的,整行。不幸的是,没有内置的函数来只选择包含内容的单元格。我猜find函数查找单个单元格,但是filter会查找行,而不是单元格。您可以做的是复制rng,将其移动到另一张工作表,然后使用循环删除所有空白单元格。(如果您使用application.screenUpdate=false,它甚至不会记录日志)这样,您就只剩下包含数据的单元格了。。。确保在删除后包含“xlshiftoleft”,以便数据转移
dim numrows as long
dim numcolumns as long 

numrows = Cells.find("*", [A1], , , xlByRows, xlPrevious).Row
numcolumns = Cells.find("*", [A1], , , xlByColumns, xlPrevious).Column