AdvancedFitler 使用公式从 ListRange 输出值

AdvancedFitler Out Values from ListRange using Formula

我正在尝试设置 AdvancedFilter 以过滤掉 ListRange 项目。经过一些测试,我意识到当我使用 2 个单元格的标准范围时,它只接受使用 <>A 的“公式”。如果我添加第三个 <>B 它什么都不做。

我最初的想法很简单,就是在我的列 <> 前加上每个单元格的值,但现在看来行不通了。我需要想办法以某种方式同时应用公式和范围。

IE:

数据:

Let Num
A   1
B   2
C   3

这适用于过滤器范围:

Let
<>B

这不是:

Let
<>B
<>C

但是我的 CriteriaRng 看起来像这样:

Let
B
C

如何为 Let 列中的所有项目引用一种表达方式,在 CriteriaRange:=

中过滤 <>Cell.Value

这是我 tried/debugged 这个问题的基本代码:

 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:$A,0))

但我需要通过 VBA 构建该公式并使其更加通用。我比 VBA 更好,然后是公式。

我还在这个 post 中读到他基本上是通过常规过滤器使用突出显示,然后是另一个基于突出显示的过滤器,但我知道有更好的方法在单元格中使用公式。

我想我也可以在某个地方使用高级过滤器在交错行时执行“或”操作,因此我可以使我的列成为交错列,但这听起来也很老套,我无法让它继续工作我的简短尝试。

如果您的条件中有多行,那么您正在执行 OR 操作。如果你想做一个 AND 操作,你需要在你的标准中有一行,但同一个标题被多次列出,见下文。

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

我基本上是从这个答案中复制我的答案,但是构建了 FormulaStr 并使其更加自动化,这就是 VBA 的重点!

https://whosebug.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, CriteriaRng.Column + 1), Cells(1, CriteriaRng.Column + 1)).Clear
Set FormulaRng = ws.Range(Cells(1, CriteriaRng.Column + 1), Cells(2, CriteriaRng.Column + 1))

DataRng.AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=FormulaRng, Unique:=False

End Sub

备注:

  • 您必须在第 2 行输入公式并使 FilterRng 恰好为 2 行!
  • Header 应为空白
  • 公式应如下所示 =ISNA(MATCH(A2,$D:$D,0)),其中 A2 是筛选范围内条件列 headers 下方的第一行,D1:D3 是条件列。