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 是条件列。
我正在尝试设置 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 是条件列。