AdvancedFitler 使用公式从 ListRange 输出值

问题描述

我正在尝试设置 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,请参见下文。 enter image description here

如果您分别命名范围:数据库、标准和提取,然后记录一个宏并运行高级过滤器,它将为您编写代码。然后您可以修改代码以接受变量输入。

,

我基本上从这个答案中复制了我的答案,但构建了 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 是标准列。