为 1 行选择多个条件的高级过滤器

Advanced Filter with multiple criteria selected for 1 row

Sheet1 包含我的数据,这也成为我的过滤数据,因为我已经设置了过滤器而不是复制范围。

跨页上的条件范围sheet 由用户窗体命令按钮填充,该按钮也应用高级过滤器。

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

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

我在使用 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

我已经将 sheet 设置为在代码之前和代码之后取消保护(以及我在用户表单上的其他 select 离子,它们工作正常)。我试过使用 'OR' 和 'Else:' 无济于事。

任何关于如何解决我的问题以在 selecting 多个项目时过滤上述内容的建议将不胜感激,而我不必为数据中的每个条件创建额外的列,因为我将不得不移动手动加载条件格式,这会在我已经很大的 sheet.

上造成太多混乱

简而言之,AdvancedFilter 过滤条件要求:

  • 在行之间传播过滤器值以实现某些 "OR" 条件

  • 将过滤器值保持在同一行以实现某些 "AND" 条件

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

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

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

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

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

如果这是您需要的,那么您可以从标准范围中删除 BL 到 BM 和 BO 到 BR 的列(因此调整所有 BN 引用到 BL)

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