问题描述
我正在尝试设置 AdvancedFilter 以过滤出 ListRange 的项目。经过一些测试,我意识到当我使用 2 个单元格的标准范围时,它只接受使用 <>A
的“公式”。如果我添加第三个 <>B
,它什么也不做。
我最初的想法很简单,将 <>
列添加到每个单元格值的前面,但现在似乎行不通了。我需要想办法以某种方式同时应用公式和范围。
浏览器:
数据:
Let Num
A 1
B 2
C 3
这适用于过滤器范围:
Let
<>B
这不会:
Let
<>B
<>C
但我的 CriteriaRng 看起来像这样:
Let
B
C
我如何引用一种方式来表示 Let
列中的所有项目,过滤 <>Cell.Value
中的 Criteriarange:=
这是我尝试/调试此问题的基本代码:
FilterRng.AdvancedFilter Action:=xlFilterInPlace,Criteriarange:=Range("D1:D3"),Unique:=False
Stop
FilterRng.AdvancedFilter Action:=xlFilterInPlace,Criteriarange:=Range("D1:D2"),Unique:=False
Stop
更新:
我找到了这个例子 --> https://www.mrexcel.com/board/threads/with-adavnced-filter-how-do-i-exclude-a-value.733153/page-2
=ISNA(MATCH($A9,Exclude!$A$1:$A$2,0))
但我需要通过 VBA 构建该公式并使其更加通用。我用 VBA 比用公式更好。
我还在这篇文章中读到,他基本上通过常规过滤器使用高亮显示,然后是另一个基于高亮显示的过滤器,但我知道在单元格中使用公式有更好的方法。
https://stackoverflow.com/a/34012365/5079799
我想我也可以在使用高级过滤器交错行时在某个地方执行“或”操作,因此我可以使我的列成为交错列,但这听起来也很笨拙,我无法让它在我的简介中工作尝试。
解决方法
如果您的 Criteria 中有多行,则您正在执行 OR 操作。如果您想进行 AND 运算,您的条件中需要一行,但多次列出相同的 Caption,请参见下文。
如果您分别命名范围:数据库、标准和提取,然后记录一个宏并运行高级过滤器,它将为您编写代码。然后您可以修改代码以接受变量输入。
,我基本上从这个答案中复制了我的答案,但构建了 FormulaStr
并使其更加自动化,这就是 VBA 的重点!
https://stackoverflow.com/a/28506854/5079799
Sub Test()
Dim ws As Worksheet
Set ws = ActiveSheet
Dim CriteriaRng As Range,DataRng As Range
Set CriteriaRng = ws.Range("D1:D3")
Set DataRng = ws.Range("A1:B4")
Dim FormulaRng As Range,FormulaStr As String,DataRngCellTwoStr As Range
Set DataRngCellTwoStr = Cells(DataRng.Row + 1,DataRng.Column)
Set FormulaRng = ws.Range(Cells(2,CriteriaRng.Column + 1),Cells(2,CriteriaRng.Column + 1))
FormulaStr = "=ISNA(MATCH(" & DataRngCellTwoStr.Address(False,False) & "," & CriteriaRng.Address & ",0))"
FormulaRng.Value = FormulaStr
ws.Range(Cells(1,Cells(1,CriteriaRng.Column + 1)).Clear
Set FormulaRng = ws.Range(Cells(1,CriteriaRng.Column + 1))
DataRng.AdvancedFilter Action:=xlFilterInPlace,CriteriaRange:=FormulaRng,Unique:=False
End Sub
注意事项:
- 您必须在第 2 行输入公式,并使 FilterRng 正好为 2 行!
- 标题应该是空白的
- 公式应如下所示
=ISNA(MATCH(A2,$D$1:$D$3,0))
,其中 A2 是过滤器范围中标准列标题下方的第一行,D1:D3 是标准列。