使用 vba 过滤两个值之间的数据

Chr*_*ris 0 excel vba

我有两张纸,第一张叫做 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)

Tom*_*Tom 5

我认为您的问题是由于未声明要正确过滤的范围造成的,因为在您的代码中,您只查看单元格 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)