高级过滤器,为1行选择了多个条件
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高级过滤器,为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:'无济于事。
任何建议将非常感谢我如何解决我的问题,以便在选择多个项目时过滤上述内容,而不必为数据中的每个条件创建额外的列,因为我将不得不手动移动条件格式的负载,它也将创建在我已经很大的床单上杂乱无章。
简而言之,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
上使用显式工作表引用而不是隐式依赖(如你的代码当前所做)
以上是关于高级过滤器,为1行选择了多个条件的主要内容,如果未能解决你的问题,请参考以下文章