【问题标题】:Automating Excel Autofilter with VBA使用 VBA 自动化 Excel 自动筛选
【发布时间】:2017-12-20 17:19:35
【问题描述】:

我目前正在使用以下 VBA,但需要在此基础上进行一些改进。

Option Explicit
Sub AutoFilterData()
Dim wsData As Worksheet

Set wsData = ThisWorkbook.Worksheets("Master")
With wsData
    On Error Resume Next
    '//Reset Autofilter
    .ShowAllData
    ThisWorkbook.Worksheets("Master").Range("A1:BZ1").AutoFilter 2,
    ThisWorkbook.Worksheets("Summary-LT BD").Range("H1")
End With
 '//Close my objects
Set wsData = Nothing
End Sub

当我运行上述代码时,即使单元格 H1 已填充并且匹配主选项卡中第二列中的值,过滤器也会返回零结果。除了将 H1 用作过滤器的一部分之外,我还需要能够使用单元格 Q4-Q11 的“Summary-LT BD”选项卡添加其他自动过滤条件,如果选择了一个值,如果和 Q4-Q11=" " 那么我需要显示该标准的所有值。我最终会将此宏添加到 excel 中的按钮单击中,作为某些表值的详细视图。

TIA 寻求帮助!

杰西

【问题讨论】:

  • 首先,首先删除On Error Resume Next,然后再次尝试运行您的代码。如果没有发生任何事情,您可能只是得到了一个错误。

标签: vba excel autofilter


【解决方案1】:

所以我把一些东西放在一起。我很接近。所以前 3 个自动过滤器效果很好。我现在的问题是,当我在 q 范围之一中将一个值留空时(这将是我不希望对该值进行过滤时)我得到一个空白输出。我假设我需要某种 if "", show "*" 类型的语句。

    Option Explicit
    Sub NeedIn()
    Dim wsData As Worksheet

    Set wsData = ThisWorkbook.Worksheets("Master")

    With wsData
        On Error Resume Next
        '//Reset Autofilter
        .ShowAllData
        wsData.Range("A1:BZ1").AutoFilter 23, "Inside LT"
        wsData.Range("A1:BZ1").AutoFilter 75, "Need Date Moved In"
        wsData.Range("A1:BZ1").AutoFilter 2, ThisWorkbook.Worksheets("Summary-LT BD").Range("H1").Value
        wsData.Range("A1:BZ1").AutoFilter 4, ThisWorkbook.Worksheets("Summary-LT BD").Range("Q4").Value
        wsData.Range("A1:BZ1").AutoFilter 3, ThisWorkbook.Worksheets("Summary-LT BD").Range("Q5").Value
        wsData.Range("A1:BZ1").AutoFilter 5, ThisWorkbook.Worksheets("Summary-LT BD").Range("Q6").Value
        wsData.Range("A1:BZ1").AutoFilter 6, ThisWorkbook.Worksheets("Summary-LT BD").Range("Q7").Value
        wsData.Range("A1:BZ1").AutoFilter 7, ThisWorkbook.Worksheets("Summary-LT BD").Range("Q8").Value
        wsData.Range("A1:BZ1").AutoFilter 8, ThisWorkbook.Worksheets("Summary-LT BD").Range("Q9").Value
        wsData.Range("A1:BZ1").AutoFilter 9, ThisWorkbook.Worksheets("Summary-LT BD").Range("Q10").Value
        wsData.Range("A1:BZ1").AutoFilter 10, ThisWorkbook.Worksheets("Summary-LT BD").Range("Q11").Value

        Sheets("Master").Select
        Cells.Select
        Selection.Copy
        Workbooks.Add
        ActiveSheet.Paste
        Cells.Select
        Cells.EntireColumn.AutoFit

    End With
    Set wsData = ThisWorkbook.Worksheets("Master")

    With wsData
        On Error Resume Next
        '//Reset Autofilter
        .ShowAllData
     '//Close my objects
    End With
    Set wsData = Nothing
    End Sub

【讨论】:

    【解决方案2】:

    以下内容如何:

    Option Explicit
    Sub AutoFilterData()
    Dim wsData As Worksheet
    
    Set wsData = ThisWorkbook.Worksheets("Master")
    
    wsData.Range("$A$1:$BZ$1").AutoFilter Field:=2, Criteria1:=ThisWorkbook.Worksheets("Summary-LT BD").Range("H1")
    
    'if you want to use multiple criteria to filter then you would have to use something like below (using an array of values to filter):
    'wsData.Range("$A$1:$BZ$1").AutoFilter Field:=2, Criteria1:=Array("A", "B", "C", "D", "E"), Operator:=xlFilterValues
    End Sub
    

    更新

    这将让您选择多个字段/列以使用多个条件进行过滤:

    Option Explicit
    Sub AutoFilterData()
    Dim wsData As Worksheet
    Dim LastRow As Long
    Dim H1Value As String
    
    Set wsData = ThisWorkbook.Worksheets("Master")
    LastRow = wsData.Cells(wsData.Rows.Count, "A").End(xlUp).Row
    'wsData.Range("$A$1:$BZ$" & LastRow).AutoFilter field:=2, Criteria1:=ThisWorkbook.Worksheets("Summary-LT BD").Range("H1")
    
    'Or to filter multiple fields/columns then the code below will do it
    H1Value = Worksheets("Summary-LT BD").Range("H1").Value
    With wsData
    .AutoFilterMode = False
    .Range("A1:BZ" & LastRow).AutoFilter
    .Range("A1:BZ" & LastRow).AutoFilter field:=2, Criteria1:=H1Value
    .Range("A1:BZ" & LastRow).AutoFilter field:=23, Criteria1:="Inside LT"
    .Range("A1:BZ" & LastRow).AutoFilter field:=75, Criteria1:="Other"
    End With
    End Sub
    

    【讨论】:

    • 我尝试了你所拥有的,但还没有运气。如果我使用多个标准,则需要来自不同的列。这是一个示例,尽管我知道设置不正确,但我认为您会得到我想要做的。 wsData.Range("$A$1:$BZ$1").AutoFilter Field:=Array(2,23,75) Criteria1:=Array(ThisWorkbook.Worksheets("Summary-LT BD").Range("H1") , "Inside LT", "Other"), Operator:=xlFilterValues
    • 用一些可以让你做你期望的事情来更新我的答案,你不能简单地为你要过滤的字段数添加一个数组,...请检查我的答案并让我知道你过得怎么样...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多