Table of contents
在这个快速课程中,你将学习如何在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函数返回非相邻的列,可以使用这个巧妙的技巧。
- 用所需的条件制作一个FILTER公式,使用整个表格进行过滤。 阵列 .
- 将上述公式嵌入另一个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错误
发生在当 阵列 和 包括 争论有不相容的层面。
#N/A,#VALUE,等等。
如果在 "A "和 "B "中的某些值出现了不同的错误,就会出现不同的错误。 包括 参数是一个错误,或者不能转换为一个布尔值。
#NAME错误
当试图在旧版本的Excel中使用FILTER时出现。 请记住,这是一个新功能,只在Office 365和Excel 2021中可用。
在新的Excel中,如果你不小心拼错了函数的名称,就会出现#NAME错误。
#SPILL错误
大多数情况下,如果溢出区的一个或多个单元格不是完全空白,就会出现这种错误。 要解决这个问题,只需清除或删除非空单元格即可。 要调查和解决其他情况,请参见Excel中的#SPILL!错误:它意味着什么以及如何解决。
#REF!错误
当在不同的工作簿之间使用FILTER公式,而源工作簿被关闭时,会出现这种情况。
这就是如何在Excel中动态归档数据的方法。 感谢你的阅读,希望下周在我们的博客上见到你!
下载实践工作手册
在Excel中用公式过滤(.xlsx文件)