自动filter后应用高级filter

我想要做两个连续的过滤; 我使用自动filter的date首先,我想要做的事情filter产生的结果(因为我有OR)。 所以我最先做的是将范围variables设置为未经过滤的范围。

Set rng = Range(ws.Cells(1, 1), ws.Cells(rowNos, colNos)) 

然后使用自动filter我过滤给定的date。

 rng.AutoFilter Field:=1, Criteria1:=">" & lDate 

由于现在有些行会被隐藏,我想应用高级filter,我使用了特殊的单元

 rng.SpecialCells(xlCellTypeVisible).AdvancedFilter Action:=xlFilterCopy, _ CriteriaRange:=crt, CopyToRange:=thisWB.Worksheets("Sheet3").Range("A1"), _ Unique:=False 

然而,在最后一步我遇到了一个错误:“该命令至less需要两行数据”。我确定至less有100行符合标准,这意味着错误不是由于缺less行。

请帮我解决问题。 另外,如果还有另一种方法,我可以完成任务,我会很乐意改变我的代码。 我想要做的是为特定的date筛选一个表,然后再次筛选两列的值(通常使用高级筛选器)。

看起来像.AdvancedFilter不适用于不连续的范围。 下面的代码有点kludge-y,但是为了一个小例子,我把它们放在了一起,我想返回的观察结果是2014年4月1日,其中Foo = Yes,Bar = 7。我的数据表恰好包含一行匹配所有这些标准。

建立

 Option Explicit Sub FilterTwice() Dim DataSheet As Worksheet, TargetSheet As Worksheet, _ ControlSheet As Worksheet, TempSheet As Worksheet Dim DataRng As Range, ControlRng As Range, _ TempRng As Range Dim lDate As Date Dim LastRow As Long, LastCol As Long 'assign sheets for easy reference Set DataSheet = ThisWorkbook.Worksheets("Sheet1") Set ControlSheet = ThisWorkbook.Worksheets("Sheet2") Set TargetSheet = ThisWorkbook.Worksheets("Sheet3") 'clear any previously-set filters Call ClearAllFilters(DataSheet) 'assign data range LastRow = DataSheet.Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row LastCol = DataSheet.Cells.Find("*", SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column Set DataRng = Range(DataSheet.Cells(1, 1), DataSheet.Cells(LastRow, LastCol)) 'assign a control (or critieria) range for the advanced filter Set ControlRng = Range(ControlSheet.Cells(1, 1), ControlSheet.Cells(2, 2)) 'apply date filter lDate = "4/1/2014" With DataRng .AutoFilter Field:=1, Criteria1:=">" & lDate End With 'add a temporary sheet and copy the visible cells to create a continuous range Set TempSheet = Worksheets.Add DataRng.SpecialCells(xlCellTypeVisible).Copy TempSheet.Range("A1").PasteSpecial Paste:=xlPasteAll 'assign temp range LastRow = TempSheet.Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row LastCol = TempSheet.Cells.Find("*", SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column Set TempRng = Range(TempSheet.Cells(1, 1), TempSheet.Cells(LastRow, LastCol)) 'apply advanced filter to temp range and get obs where foo = yes and bar = 7 With TempRng .AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=ControlRng, _ CopyToRange:=TargetSheet.Range("A1"), Unique:=False End With 'remove the temp sheet and clear filters on the data sheet Application.DisplayAlerts = False TempSheet.Delete Application.DisplayAlerts = True DataSheet.AutoFilterMode = False End Sub Sub ClearAllFilters(cafSheet As Worksheet) With cafSheet .AutoFilterMode = False If .FilterMode = True Then .ShowAllData End If End With End Sub