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

问题描述 投票:1回答:1

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

任何建议将非常感谢我如何解决我的问题,以便在选择多个项目时过滤上述内容,而不必为数据中的每个条件创建额外的列,因为我将不得不手动移动条件格式的负载,它也将创建在我已经很大的床单上杂乱无章。

vba listbox criteria multi-select advanced-filter
1个回答
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)

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

© www.soinside.com 2019 - 2024. All rights reserved.