我有两张纸,第一张叫做 Enter,第二张叫做 Results
我有两个单元格 E2 和 F2。E2 允许用户输入下限,F2 允许用户输入我需要用来自动过滤结果表中数据的上限。结果表中的 D 列标题为数字。
我试图开始,但不确定如何在两个值之间进行过滤。
Worksheets("Results").Range("D2").AutoFilter Field:=1, Criteria1:= _
">" & Worksheets("Enter").Range("E2").Value, Operator:=xlAnd, Criteria2:="<" & Worksheets("Entry").Range("E3").Value
Run Code Online (Sandbox Code Playgroud)
我认为您的问题是由于未声明要正确过滤的范围造成的,因为在您的代码中,您只查看单元格 D2 进行过滤
尝试
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Results")
With ws
.Range("$D$2:$D$" & .Range("D" & Rows.Count).End(xlUp).Row).AutoFilter field:=1, _
Criteria1:=">" & Worksheets("Enter").Range("E2").Value, _
Operator:=xlAnd, _
Criteria2:="<" & Worksheets("Entry").Range("E3").Value
End With
Run Code Online (Sandbox Code Playgroud)
更新 1: 要在条件为空时忽略过滤器,请使用:
Dim ws As Worksheet
Dim Enter As Worksheet
Dim Entry As Worksheet
Set ws = ThisWorkbook.Sheets("Results")
Set Enter = ThisWorkbook.Sheets("Enter")
Set Entry = ThisWorkbook.Sheets("Entry")
If Not IsEmpty(Enter.Range("E2")) And Not IsEmpty(Entry.Range("E3")) Then
With ws
.Range("$D$2:$D$" & .Range("D" & Rows.Count).End(xlUp).Row).AutoFilter Field:=1, _
Criteria1:=">" & Enter.Range("E2").value, _
Operator:=xlAnd, _
Criteria2:="<" & Entry.Range("E3").value
End With
End If
Run Code Online (Sandbox Code Playgroud)
更新 2: 我已经重写了很多代码,以包含您正在使用表并包含注释中详述的第二个过滤器。我还对代码进行了注释,以帮助您了解它在做什么以及为什么
Dim ws As Worksheet: Dim Enter As Worksheet: Dim Entry As Worksheet
Dim NoRow As Integer
Dim c
' Turn off screen updating (code runs faster)
Application.ScreenUpdating = False
' Set worksheets to variables
Set ws = ThisWorkbook.Sheets("Results")
Set Enter = ThisWorkbook.Sheets("Enter")
Set Entry = ThisWorkbook.Sheets("Entry")
With ws.ListObjects("Results")
' Reset the filter for the Results table
.AutoFilter.ShowAllData
' Test to see if between criteria is set if not the results table will stay unfiltered
If Not IsEmpty(Enter.Range("E2")) And Not IsEmpty(Entry.Range("E3")) Then
' Find how many Locations are set to show. If none macro will exit the sub
With Entry.ListObjects("Location")
.Range.AutoFilter field:=.ListColumns("Show").Index, _
Criteria1:="Show"
' Error handling
On Error Resume Next
NoRow = .DataBodyRange.SpecialCells(xlCellTypeVisible).Rows.Count
On Error GoTo 0
End With
' Filter 'Show' Locations
If NoRow = 1 Then
.Range.AutoFilter field:=.ListColumns("Location").Index, _
Criteria1:=Entry.ListObjects("Location") _
.DataBodyRange.SpecialCells(xlCellTypeVisible).Cells(1, 1)
' Handle if all Locations are hidden
ElseIf NoRow = 0 Then
MsgBox "All Locations are hidden"
GoTo CleanUp
End If
' Filter Area with between criteria
.Range.AutoFilter field:=.ListColumns("Area").Index, _
Criteria1:=">" & Enter.Range("E2").Value, _
Operator:=xlAnd, _
Criteria2:="<" & Entry.Range("E3").Value
End If
End With
CleanUp:
' Reset Location table to show all Locations again
Entry.ListObjects("Location").AutoFilter.ShowAllData
Application.ScreenUpdating = True
Run Code Online (Sandbox Code Playgroud)