Excel FILTER函数--用公式进行动态过滤

  • Share This
Michael Brown

在这个快速课程中,你将学习如何在Excel中用公式进行动态过滤。 例如,过滤重复的单元格、包含特定文本的单元格、多条件的单元格等等。

你通常如何在Excel中进行过滤? 大多数情况下,使用自动过滤,在更复杂的情况下使用高级过滤。 这些方法快速而强大,但有一个明显的缺点--当你的数据发生变化时,它们不会自动更新,这意味着你必须清理并重新进行过滤。 Excel 365中引入的FILTER函数成为人们期待已久的替代方法,它可以替代与它们不同的是,Excel公式会在每次工作表变化时自动重新计算,所以你只需要设置一次过滤器就可以了!

    Excel的FILTER功能

    Excel中的FILTER函数是用来根据你指定的标准来过滤一个数据范围的。

    该函数属于动态数组函数的范畴。 其结果是一个自动溢出的数值数组,从你输入公式的单元格开始,自动溢出到一个单元格范围。

    FILTER函数的语法如下。

    FILTER(array, include, [if_empty])

    在哪里?

    • 阵列 (必填) - 你想过滤的数值范围或数组。
    • 包括 (required) - 以布尔数组形式提供的标准(TRUE和FALSE值)。

      它的高度(当数据在列中时)或宽度(当数据在行中时)必须等同于 阵列 争论。

    • 如果是空的 (可选) - 当没有条目符合标准时要返回的值。

    FILTER功能仅在Excel for Microsoft 365和Excel 2021中可用。 在Excel 2019、Excel 2016和早期版本中,不支持该功能。

    基本的Excel FILTER公式

    首先,让我们讨论几个非常简单的案例,以便更多地了解Excel公式是如何过滤数据的。

    从下面的数据集中,假设你想提取具有特定值的记录,在 集团 要做到这一点,我们向B2:B13="C "提供表达式。 包括 参数,这将产生一个所需的布尔数组,TRUE对应于 "C "值。

    =FILTER(A2:C13, B2:B13="C", "无结果")

    在实践中,在一个单独的单元格中输入标准,例如F1,并使用单元格引用,而不是直接在公式中硬编码值,这样做更方便。

    =FILTER(A2:C13, B2:B13=F1, "无结果" )

    与Excel的过滤功能不同,该函数不对原始数据做任何改变。 它将过滤后的记录提取到所谓的溢出范围(下面的截图中为E4:G7),从输入公式的单元格开始。

    如果没有符合指定条件的记录,公式会返回你在 if_empty 参数,本例中为 "无结果"。

    如果你愿意 无回报 在这种情况下,则为最后一个参数提供一个空字符串("")。

    =filter(a2:c13, b2:b13=f1, "" )

    如果你的数据是有组织的 横向 就像下面的截图中显示的那样,从左到右,FILTER函数也能很好地工作。 只要确保你为 阵列 包括 参数,所以源数组和布尔数组有相同的宽度。

    =FILTER(B2:M4, B3:M3= B7, "无结果" )

    Excel FILTER函数--使用说明

    要想在Excel中有效地用公式进行过滤,这里有几个重要的点需要注意。

    • FILTER函数会自动在工作表中纵向或横向溢出结果,这取决于你的原始数据是如何组织的。 所以,请确保你总是有足够的空单元格在下面和右边,否则你会得到一个#SPILL错误。
    • Excel FILTER函数的结果是动态的,这意味着当原始数据集的值发生变化时,它们会自动更新。 然而,为FILTER提供的范围是 阵列 参数在源数据中添加新条目时不会被更新。 如果你希望 阵列 自动调整大小,然后将其转换为Excel表格,用结构化引用建立公式,或创建一个动态的命名范围。

    如何在Excel中进行过滤--公式示例

    现在你知道了基本的Excel过滤公式是如何工作的,现在是时候了解一下如何扩展它来解决更复杂的任务了。

    具有多个标准的过滤器(AND逻辑)。

    要用多个标准来过滤数据,你需要提供两个或多个逻辑表达式给 包括 争论。

    FILTER(array, ( 范围1 标准1 ) * ( 范围2 标准2 ), "没有结果")

    乘法操作处理的数组有 和逻辑 ,确保只有符合以下条件的记录 所有的标准 从技术上讲,它是这样的。

    每个逻辑表达式的结果是一个布尔值数组,其中TRUE等于1,FALSE等于0。 然后,所有数组中相同位置的元素被相乘。 由于乘以0总是得到0,只有所有条件都是TRUE的项目才能进入结果数组,因此只有这些项目被提取。

    下面的例子显示了这个通用公式的作用。

    例1.在Excel中过滤多列

    将我们的基本Excel FILTER公式再延伸一下,让我们通过两列来过滤数据。 集团 (B栏)和 赢家 (C栏)。

    为此,我们设置了以下标准:在F2中输入目标组的名称( 标准1 )和F3的最低要求胜场数( 标准2 ).

    鉴于我们的源数据是在A2:C13( 阵列 ),小组在B2:B13( 范围1 ),赢在C2:C13 ( 范围2 ),该公式采取这种形式。

    =FILTER(A2:C13, (B2:B13=F2) * (C2:C13>=F3), "无结果")

    结果,你会得到一份A组中取得2场或更多胜利的球员名单。

    例2.过滤日期之间的数据

    首先,应该注意的是,在Excel中不可能编出一个通用的公式来进行日期过滤。 在不同的情况下,你需要以不同的方式建立标准,这取决于你是想按特定日期、按月还是按年进行过滤。 这个例子的目的是演示一般的方法。

    在我们的样本数据中,我们再增加一列,包含最后一次获胜的日期(D列)。 而现在,我们将提取发生在特定时期的胜利,例如5月17日至5月31日之间。

    请注意,在这种情况下,两个标准都适用于同一个范围。

    =FILTER(A2:D13, (D2:D13>=G2) * (D2:D13<=G3), "没有结果")

    其中G2和G3是要过滤的日期。

    具有多个标准的过滤器(OR逻辑)。

    为了提取基于多个OR条件的数据,你也可以使用前面例子中所示的逻辑表达式,但不是相乘,而是相加。 当表达式返回的布尔数组相加时,所得数组中不符合任何条件的条目将为0(即所有条件都是FALSE),这样的条目将被过滤掉。至少有一个标准为 "真",就会被提取出来。

    下面是用OR逻辑过滤列的通用公式。

    FILTER(array, ( 范围1 标准1 ) + ( 范围2 标准2 ), "没有结果")

    作为一个例子,让我们提取一个有以下情况的球员名单 这或那 赢的次数。

    假设源数据在A2:C13,胜率在C2:C13,感兴趣的胜率在F2和F3,公式如下。

    =FILTER(A2:C13, (C2:C13=F2) + (C2:C13=F3), "无结果")

    结果,你知道哪些球员赢得了所有的比赛(4),哪些球员没有赢得比赛(0)。

    基于多个AND以及OR标准的过滤器

    当你需要应用两种标准类型时,记住这个简单的规则:用星号(*)连接AND标准,用加号(+)连接OR标准。

    例如,要返回一个具有给定胜场数(F2)且属于E2或E3中提到的组的球员列表,请建立以下逻辑表达链。

    =FILTER(A2:C13, (C2:C13=F2) * ((B2:B13=E2) + (B2:B13=E3)), "没有结果")

    而你将得到以下结果。

    如何过滤Excel中的重复数据

    在处理巨大的工作表或结合不同来源的数据时,往往有可能会有一些重复的数据溜进来。

    如果你正在寻找 过滤掉 重复 并提取唯一的项目,然后使用UNIQUE函数,如上述链接的教程中所解释的那样。

    如果你的目标是 过滤重复的内容 ,即提取出现一次以上的条目,然后与COUNTIFS一起使用FILTER函数。

    这个想法是为了获得所有记录的出现次数,并提取那些大于1的记录。 为了获得计数,你为每条记录提供相同的范围。 标准_范围 / 标准 这对COUNTIFS就像这样。

    FILTER( 阵列 , COUNTIFS( 列1 , 列1。 第2栏 , 第2栏 )>1, "没有结果")

    例如,要从A2:C20的数据中根据所有3列的值过滤重复的行,这里是要使用的公式。

    =FILTER(A2:C20, COUNTIFS(A2:A20, A2:A20, B2:B20, B2:B20, C2:C20, C2:C20)>1, "没有结果"。)

    提示:要想根据以下内容过滤重复的内容 关键列 ,只包括COUNTIFS函数中的那些特定列。

    如何过滤掉Excel中的空白

    过滤空白单元格的公式实际上是Excel FILTER公式的一个变体,具有多个AND条件。 在这种情况下,我们检查所有(或特定)列中是否有任何数据,并排除至少有一个单元格为空的行。 为了识别非空白单元格,你使用 "不等于 "运算符()和一个空字符串(""),像这样。

    FILTER(array, ( 列1 "") * ( 第2栏 =""),"没有结果")

    在A2:C12的源数据中,为了过滤掉含有一个或多个空白单元格的行,在E3中输入以下公式。

    过滤含有特定文本的单元格

    要提取包含某些文本的单元格,你可以使用FILTER函数和经典的If cell contains公式。

    FILTER(array, ISNUMBER(SEARCH(" 文本 ", 范围 )), "没有结果")

    以下是它的工作原理。

    • SEARCH函数在一个给定的范围内寻找一个指定的文本字符串,并返回一个数字(第一个字符的位置)或#VALUE!错误(未找到文本)。
    • ISNUMBER函数将所有数字转换为TRUE,将错误转换为FALSE,并将产生的布尔数组传递给 包括 参数的FILTER函数。

    在这个例子中,我们已经添加了 姓氏 的球员在B2:B13中,在G2中输入我们想找的名字的部分,然后用下面的公式来过滤数据。

    =FILTER(A2:D13, ISNUMBER(SEARCH(G2, B2:B13)), "无结果")

    结果,该公式检索出了含有 "han "的两个姓氏。

    筛选和计算(总和、平均、最小、最大等)。

    Excel的FILTER函数有一个很酷的地方,就是它不仅可以提取有条件的数值,还可以对过滤后的数据进行汇总。 为此,可以将FILTER与SUM、AVERAGE、COUNT、MAX或MIN等聚合函数相结合。

    例如,要汇总F1中某一特定组的数据,请使用以下公式。

    总胜率。

    =sum(filter(c2:c13, b2:b13=f1, 0))

    平均胜率。

    =average(filter(c2:c13, b2:b13=f1, 0))

    最大的胜利。

    =max(filter(c2:c13, b2:b13=f1, 0))

    最低限度的胜利。

    =min(filter(c2:c13, b2:b13=f1, 0))

    请注意,在所有的公式中,我们用零来表示 if_empty 参数,所以如果没有找到符合标准的值,公式将返回0。 提供任何文本,如 "没有结果",将导致#VALUE错误,这显然是你最不想看到的:)

    区分大小写的FILTER公式

    标准的Excel FILTER公式是不区分大小写的,这意味着它不区分小写和大写的字符。 要区分文本大小写,可以将EXACT函数嵌套在 包括 这将迫使FILTER以区分大小写的方式进行逻辑测试。

    FILTER(array, EXACT( 范围 , 标准 ), "没有结果")

    假设,你有两组 A a 希望提取组别为小写字母 "a "的记录。 要做到这一点,使用以下公式,其中A2:C13是源数据,B2:B13是要过滤的组别。

    =FILTER(A2:C13, EXACT(B2:B13, "a"), "无结果")

    像往常一样,你可以在一个预定义的单元格中输入目标组,比如说F1,并使用该单元格参考而不是硬编码文本。

    =FILTER(A2:C13, EXACT(B2:B13, F1), "无结果" )

    如何对数据进行过滤并只返回特定的列

    在大多数情况下,用一个公式过滤所有的列是Excel用户所希望的。 但如果你的源表包含几十甚至几百个列,你可能当然希望将结果限制在几个最重要的列。

    例1.过滤一些相邻的列

    当你想让一些相邻的列出现在FILTER的结果中时,只需将这些列包括在 阵列 因为正是这个参数决定了要返回哪些列。

    在基本的FILTER公式例子中,假设你希望返回前两列( 命名 集团 所以,你提供A2:B13为 阵列 争论。

    =FILTER(A2:B13, B2:B13=F1, "无结果" )

    作为结果,我们得到了F1中定义的目标群体的参与者名单。

    例2.过滤不相邻的列

    要使FILTER函数返回非相邻的列,可以使用这个巧妙的技巧。

    1. 用所需的条件制作一个FILTER公式,使用整个表格进行过滤。 阵列 .
    2. 将上述公式嵌入另一个FILTER函数中。 为了配置 "包装 "函数,使用一个TRUE和FALSE值的数组常数或1和0来表示 包括 参数,其中TRUE(1)标志着要保留的列,FALSE(0)标志着要排除的列。

    例如,为了只返回 名称 (第1栏)和 赢家 (第三列),我们使用{1,0,1}或{TRUE,FALSE,TRUE}来表示。 包括 外层FILTER函数的参数。

    =filter(filter(a2:c13, b2:b13=f1), {1,0,1})

    =filter(filter(a2:c13, b2:b13=f1), {true, false, true})

    如何限制FILTER函数返回的行数

    如果你的FILTER公式找到了相当多的结果,但你的工作表空间有限,你不能删除下面的数据,那么你可以限制FILTER函数返回的行数。

    让我们在一个简单的公式的例子上看看它是如何工作的,这个公式是在F1中拉动目标群体的球员。

    =filter(a2:c13, b2:b13=f1)

    上面的公式输出所有找到的记录,在我们的例子中是4行。 但假设你只有两行的空间。 要只输出找到的前两行,你需要这样做。

    • 将FILTER公式插入 阵列 参数的INDEX函数。
    • 对于 行数_num 它决定了要返回多少行(在我们的例子中是2行)。
    • 对于 列_num 参数,使用像{1,2,3}这样的水平数组常数。 它指定了要返回的列(在这个例子中是前3列)。
    • 为了处理在没有找到符合你标准的数据时可能出现的错误,你可以用IFERROR函数来包装你的公式。

    完整的公式有这样的形式。

    =IFERROR(INDEX(FILTER(A2:C13, B2:B13=F1), {1;2}, {1,2,3}), "没有结果")

    当处理大型表格时,手动编写数组常数可能相当麻烦。 没问题,SEQUENCE函数可以为你自动生成连续的数字。

    =IFERROR(INDEX(FILTER(A2:C13, B2:B13=F1), SEQUENCE(2), SEQUENCE(1, COLUMNS(A2:C13)), "没有结果")

    第一个SEQUENCE产生一个垂直数组,包含第一个(也是唯一的)参数中指定的连续数字。 第二个SEQUENCE使用COLUMNS函数来计算数据集中的列数,并产生一个等效的水平数组。

    提示:要返回来自 具体栏目 而不是所有的列,在水平阵列常数中,你用于 列_num 参数,只包括那些特定的数字。 例如,要从第1和第3列提取数据,使用{1,3}。

    Excel的FILTER功能不工作

    当你的Excel FILTER公式出现错误时,很可能是下列情况之一。

    #CALC!错误

    发生,如果可选的 if_empty 参数被省略,而没有找到符合标准的结果。 原因是目前Excel不支持空数组。 为了防止这种错误,请确保总是定义 if_empty 在你的公式中的值。

    #VALUE错误

    发生在当 阵列 包括 争论有不相容的层面。

    如果在 "A "和 "B "中的某些值出现了不同的错误,就会出现不同的错误。 包括 参数是一个错误,或者不能转换为一个布尔值。

    #NAME错误

    当试图在旧版本的Excel中使用FILTER时出现。 请记住,这是一个新功能,只在Office 365和Excel 2021中可用。

    在新的Excel中,如果你不小心拼错了函数的名称,就会出现#NAME错误。

    #SPILL错误

    大多数情况下,如果溢出区的一个或多个单元格不是完全空白,就会出现这种错误。 要解决这个问题,只需清除或删除非空单元格即可。 要调查和解决其他情况,请参见Excel中的#SPILL!错误:它意味着什么以及如何解决。

    #REF!错误

    当在不同的工作簿之间使用FILTER公式,而源工作簿被关闭时,会出现这种情况。

    这就是如何在Excel中动态归档数据的方法。 感谢你的阅读,希望下周在我们的博客上见到你!

    下载实践工作手册

    在Excel中用公式过滤(.xlsx文件)

    Michael Brown is a dedicated technology enthusiast with a passion for simplifying complex processes using software tools. With more than a decade of experience in the tech industry, he has honed his skills in Microsoft Excel and Outlook, as well as Google Sheets and Docs. Michael's blog is dedicated to sharing his knowledge and expertise with others, providing easy-to-follow tips and tutorials for improving productivity and efficiency. Whether you're a seasoned professional or a beginner, Michael's blog offers valuable insights and practical advice for getting the most out of these essential software tools.