我想要做两个连续的过滤;第一个是使用自动过滤的日期,而在生成的结果上我想做的是高级过滤(因为我考虑的是OR )。所以我首先做的是将一个范围变量设置为未过滤的范围。
Set rng = Range(ws.Cells(1, 1), ws.Cells(rowNos, colNos))然后使用自动筛选I筛选给定的日期。
rng.AutoFilter Field:=1, Criteria1:=">" & lDate因为现在一些行将被隐藏,并且我想应用高级过滤器,所以我使用了特殊的单元格
rng.SpecialCells(xlCellTypeVisible).AdvancedFilter Action:=xlFilterCopy, _
CriteriaRange:=crt, CopyToRange:=thisWB.Worksheets("Sheet3").Range("A1"), _
Unique:=False然而,我在最后一步中得到了一个错误:“该命令至少需要两行数据。”我确保至少有100行符合条件,这意味着错误不是因为缺少行。
请帮我解决这个问题。此外,如果有其他方法可以完成任务,我将很乐意更改我的代码。我尝试做的是针对特定的日期筛选一个表,然后再次筛选两列上的值(就像通常使用高级筛选器所做的那样)。
发布于 2014-04-12 02:03:03
看起来.AdvancedFilter不能在非连续的范围内工作。下面的代码有点杂乱无章,但对于我想要返回> 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 Subhttps://stackoverflow.com/questions/23000377
复制相似问题