代码之家  ›  专栏  ›  技术社区  ›  5haun0

为一行选择了多个条件的高级筛选器

  •  1
  • 5haun0  · 技术社区  · 7 年前

    Sheet1包含我的数据,该数据也将成为我的筛选数据,因为我已将筛选设置到位,而不是复制范围。

    电子表格上的条件范围由UserForm命令按钮填充,该按钮还应用高级过滤器。

    此筛选器中2列的条件范围是从启用了MultiSelectMulti功能的列表框中填充的。

    我希望能够从这两个列表框中选择多个项目进行筛选。我已经尝试了以下方法,它填充了我分配的单元格。虽然我认为过滤器试图找到我在一行中分配的所有值,但不是每个单独的值,因此没有显示任何内容。

    我对使用VBA非常陌生,并且在标准范围的代码之后阅读了一些关于使用Unique:=True的帖子。我不知道怎么用这个,所以如果有人能解释一下,那就太好了。

    'SEARCH CRITERIA - JOB STATUS
    If ListBox1.Selected(0) = True Then Range("BK2") = "WON"
    If ListBox1.Selected(1) = True Then Range("BL2") = "PENDING"
    If ListBox1.Selected(2) = True Then Range("BM2") = "LOST"
    
    'SEARCH CRITERIA - WIN PERCENTAGE
    If ListBox2.Selected(0) = True Then Range("BN2").Value = "100%"
    If ListBox2.Selected(1) = True Then Range("BO2").Value = "90%"
    If ListBox2.Selected(2) = True Then Range("BP2").Value = "80%"
    If ListBox2.Selected(3) = True Then Range("BQ2").Value = "70%"
    If ListBox2.Selected(4) = True Then Range("BR2").Value = "60% OR LESS"
    
    'APPLY ADVANCED FILTER USING SELECTED CRITERIA
       Range("A6:BD99999").AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _
            Range("BH1:BR2")
    
    'BH1:BJ2 CONTAINS MY OTHER CRITERIA
    

    我已经将工作表设置为在代码之前和代码之后取消保护(以及我在用户窗体上的其他选择,它们工作正常)。我试过用“OR”和“Else”都没有用。

    如果有任何建议,我将不胜感激,因为我将不得不手动移动大量条件格式,这将在我已经很大的工作表上造成太多混乱,因此在选择多个项目时,如何解决过滤上述内容的问题,而不必为数据中的每个条件创建额外的列。

    1 回复  |  直到 7 年前
        1
  •  0
  •   DisplayName    7 年前

    简而言之 AdvancedFilter 筛选条件要求:

    • 在行之间分散筛选值以达到某种“或”条件

    • 将筛选器值保持在同一行中,以实现某些“和”条件

    我不太确定您的实际过滤需求,但我的第一个猜测是您需要以下内容(注释中有解释,我假设过滤条件包含在列表框项目本身中):

    Option Explicit
    
    Private Sub CommandButton1_Click()
        Dim iSel As Long, iRow As Long
    
        Intersect(Range("BH1:BR1").EntireColumn, ActiveSheet.UsedRange).Offset(1).ClearContents ' clear any existing filtering criteria
    
        With ListBox1 'reference ListBox1
            For iSel = 0 To 2 'loop through its items from first to third (note you can use 'For iSel = 0 To .Count-1' to loop through all its items)
                If .Selected(iSel) Then ' if current item is selected
                    iRow = iRow + 1 'update filter range row to achieve "OR" condition
                    Cells(1 + iRow, "BK") = .List(iSel) 'write current referenced listbox value in criteria range cell in a row by its own
                End If
            Next
        End With
    
        With ListBox2
            For iSel = 0 To 4
                If .Selected(iSel) Then
                    iRow = iRow + 1
                    Cells(1 + iRow, "BN") = .List(iSel)
                End If
            Next
        End With
    
        Range("A6:BD99999").AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _
            Range("BH1:BR1").Resize(iRow + 1) ' size criteria range to fit the filtering values read from listboxes
    End Sub
    

    通过这种方式,可以过滤与在两个列表框中选择的过滤值之间的任何过滤值相匹配的:BD行,即过滤后的记录将具有:

    • “BH1”单元格值引用的列中ListBox1中的任何选定值

    • “BN1”单元格值引用的列中ListBox2中的任何选定值

    如果这是您所需要的,那么您可以从条件范围中删除列BL到BM和BO到BR(从而将所有BN引用调整为BL)

    最后,我建议您使用显式的工作表引用,而不是隐式地依赖(正如您的代码当前所做的那样) ActiveSheet