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

时间:2018-02-14 02:05:05

标签: vba listbox criteria multi-select advanced-filter

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'和'其他:'无济于事。

任何建议将非常感谢如何解决我的问题,以便在选择多个项目时过滤上述内容,而不必为数据中的每个条件创建额外的列,因为我将不得不手动移动条件格式的大量会在我已经很大的纸张上造成太多的混乱。

1 个答案:

答案 0 :(得分:0)

简而言之,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)

最后我建议您使用显式工作表参考,而不是隐含地依赖{(1}}

上的代码(正如您的代码当前所做的那样)