改进后的自动筛选代码(原创)

下面的代码是在修改关键字单元格时自动触发,所以要写在 WorkSheet 中:


关于查询关键字
要查询的关键字应该放在两行,上面一行为列标题,下面一行为对应的取值,如要查询4年4班的学生,:
Private Sub Worksheet_Change(ByVal Target As Range)
  If Target.Address = "$H$2" or Target.Address = "$I$2"Then
  
    ' 修改H2或I2单元格将触发高级筛选,A4:G1415为需要筛选的数据区域(含标题行)
    ' 查询条件中可以包含通配符
 
    Range("A4:G1415").AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=Range("H1:I2"), Unique:=False

    ' 取得筛选后得到的行数
    [A4:G1415].SpecialCells(xlCellTypeVisible).Select
    ResultRows = Selection.Rows.Count

    ' 取得筛选后第一行的行号,如果要对筛选结果进行复制,需要引用行号,配合上面的返回行数即可解决
    FirstVisibleRow = [a5:a1415].SpecialCells(12)(1, 1).Row

    
    ' 如果筛选结果为空,将引发“单元格未找到”的错误,因此需捕捉错误
    On Error GoTo mark
    
    ' SpecialCells(12) 为可见单元格,后面的(1, 1)指该区域内的第一行,第一列所指的单元格
    ' 对筛选结果进行判断时排除标题行,因此下面从第 5 行开始判断

If [a5:a1415].SpecialCells(12)(1, 1).Row > 0 Then ' 移动当前焦点到筛选后结果中的第一行 D 列,去录入数据区 VisibleRowNum = [a5:a1415].SpecialCells(12)(1, 1).Row Range("d" & VisibleRowNum).Select Exit Sub End If mark: ' 错误处理,如果筛选结果为空,输入焦点保持在 C2 单元格 Range("C2").Select Exit Sub End If ' 数据录入后,焦点返回至查询框 If Target.Column = 4 Then Range("C2").Select End If End Sub

 

如果要把高级筛选的结果复制到另一工作表的话,需要注意:

    ' VBA中调用高级筛选,对 sheet1 中的数据筛选并将结果复制到 sheet2 中
    Sheets("Sheet2").Select '筛选结果复制模式如果要把结果复制到另一个sheet,目标sheet必须为当前sheet
    Sheets("Sheet1").Range("A4:E847").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Sheets("Sheet1").Range("G4:H5"), CopyToRange:=Range("A1"), Unique:=True

 

posted @ 2017-08-31 14:19  汉学  阅读(283)  评论(0)    收藏  举报