gpt4 book ai didi

vba - 自动筛选后应用高级筛选

转载 作者:行者123 更新时间:2023-12-02 21:56:54 25 4
gpt4 key购买 nike

我想做两次连续的过滤;第一个是我使用自动过滤器的日期,而我想对生成的结果进行高级过滤(因为我心里有“或”)。所以我首先做的是将范围变量设置为未过滤的范围。

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

然后使用自动过滤器过滤给定的日期。

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

因为现在有些行将被隐藏,并且我想应用高级过滤器,所以我使用了特殊单元格

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

但是我在最后一步中遇到错误“该命令需要至少两行数据......”我确保至少有 100 行符合条件,这意味着错误不是因为缺少行。

请帮我解决这个问题。另外,如果有另一种方法可以完成任务,我会很乐意更改我的代码。我想做的是针对特定日期过滤表格,然后再次过滤两列上的值(通常使用高级过滤器完成)。

最佳答案

似乎.AdvancedFilter不适用于非连续范围。下面的代码有点拼凑,但适用于我整理的一个小示例,我想返回 > 2014 年 4 月 1 日的观察结果,其中 Foo = Yes 且 Bar = 7。我的数据表包含恰好匹配的一行所有这些标准。

setup

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

关于vba - 自动筛选后应用高级筛选,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23000377/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com