Table of contents
本教程展示了如何使用SORT函数对数据数组进行动态排序。 你将学会在Excel中按字母顺序排序、按升序或降序排列数字、按多列排序等公式。
排序功能已经存在了很长时间。 但随着Excel 365中动态数组的引入,出现了一种惊人的简单方法,即用公式进行排序。 这种方法的好处是,当源数据发生变化时,结果会自动更新。
Excel的SORT函数
Excel中的SORT函数按列或行对一个数组或范围的内容进行升序或降序排序。
SORT属于动态数组函数,其结果是一个动态数组,根据源数组的形状,自动地垂直或水平地溢出到相邻的单元。
SORT函数的语法如下。
SORT(array, [sort_index], [sort_order], [by_col] )在哪里?
阵列 (必填) - 是一个要排序的数值数组或单元格范围。 这些可以是任何数值,包括文本、数字、日期、时间等。
排序_索引 (可选) - 一个整数,表示按哪一列或哪一行排序。 如果省略,则使用默认索引1。
排序_顺序 (可选) - 定义了排序顺序。
- 1或省略(默认)--升序,即从最小到最大。
- -1 - 降序,即从大到小的顺序
By_col(可选) - 一个逻辑值,表示排序的方向。
- FALSE或省略(默认)--按行排序。 你大多数时候会使用这个选项。
- TRUE - 按列排序。 如果你的数据像本例中一样被水平地组织成列,请使用该选项。
Excel的SORT函数--提示和注意事项
SORT是一个新的动态数组函数,因此它有一些你应该注意的特殊性。
- 目前,SORT函数只在Microsoft 365和Excel 2021中可用。 Excel 2019、Excel 2016不支持动态数组公式,所以SORT函数在这些版本中不可用。
- 如果由SORT公式返回的数组是最终结果(即没有传递给另一个函数),Excel会动态地创建一个适当大小的区域,并将排序后的值填充其中。 因此,要确保在你输入公式的单元格下面或/和右边总是有足够的空单元格,否则会出现#SPILL错误。
- 结果会随着源数据的变化而动态更新。 然而,这 阵列 提供给公式的数据不会自动扩展到包括被引用的 "新条目 "之外的新条目。 阵列 要包括这些项目,你需要更新 阵列 在你的公式中引用,或如本例所示将源范围转换为表,或创建一个动态命名的范围。
基本的Excel SORT公式
本例展示了Excel中按升序和降序对数据进行排序的基本公式。
假设你的数据是按字母顺序排列的,如下面的截图所示。 你想在不破坏或混合数据的情况下对B列的数字进行排序。
按升序排序的公式
要对B列中的数值从小到大进行排序,这里要用到的公式是。
=sort(a2:b8, 2, 1)
在哪里?
- A2:B8是源数组
- 2是要排序的列号
- 1是升序排序
由于我们的数据是以行为单位组织的,最后一个参数可以省略,默认为FALSE - 按行排序。
只要在任何一个空单元格(在我们的例子中是D2)中输入公式,按回车键,结果就会自动溢出到D2:E8。
按降序排序的公式
要对数据进行降序排序,即从大到小的排序,请设置 排序_顺序 参数为-1,像这样。
=sort(a2:b8, 2, -1)
在目标区域的左上角单元格中输入公式,你会得到这样的结果。
以类似的方式,你可以按字母顺序将文本值从A到Z或从Z到A进行排序。
如何在Excel中用公式对数据进行排序
下面的例子显示了SORT函数在Excel中的几个典型用途和几个非典型用途。
Excel按列排序
当你在Excel中对数据进行排序时,在大多数情况下,你改变的是行的顺序。 但当你的数据是横向组织的,行中包含标签,列中包含记录时,你可能需要从左到右排序,而不是从上到下。
要在Excel中按列排序,请设置 by_col 参数为 "真"。 在这种情况下。 排序_index 将代表一个行,而不是一个列。
例如,要对以下数据按数量从高到低排序,请使用此公式。
=sort(b1:h2, 2, 1, true)
在哪里?
- B1:H2是要排序的源数据。
- 2是排序索引,因为我们要对第二行的数字进行排序。
- -1表示降序排序
- TRUE表示对列进行排序,而不是对行进行排序
以不同的顺序对多列进行排序(多级排序)。
在处理复杂的数据模型时,你可能经常需要一个多级排序。 这可以用一个公式来完成吗? 是的,很容易!你所做的是为以下内容提供数组常数 排序_index 和 排序_顺序 争论。
例如,要对以下数据进行排序,首先要按 地区 (A列)从A到Z,然后通过 数量 .(C列)从小到大,设置以下参数。
- 阵列 是A2:C13的数据。
- 排序_索引 是阵列常数{1,3},因为我们首先按 地区 (第1栏),然后通过 数量 .(第三栏)。
- 排序_顺序 是数组常数{1,-1},因为第1列要按升序排序,第3列要按降序排序。
- 作者:col 是省略的,因为我们对行进行排序,这是默认的。
把这些论点放在一起,我们得到这个公式。
=sort(a2:c13, {1,3}, {1,-1})
而且效果非常好!第一列的文本值按字母顺序排序,第三列的数字从大到小排序。
在Excel中进行排序和过滤
如果你想用一些标准来过滤数据,并把输出的数据按顺序排列,可以同时使用SORT和FILTER函数。
SORT(FILTER(array, 标准_范围 标准 ), [sort_index], [sort_order], [by_col])FILTER函数根据你定义的标准获得一个数值数组,并将该数组传递给SORT的第一个参数。
这个公式最棒的地方是,它还能以动态溢出范围的形式输出结果,而不需要你按下Ctrl + Shift + Enter,或者猜测要复制到多少个单元格。 像往常一样,你在最上面的单元格中输入一个公式,然后按回车键。
作为一个例子,我们将从A2:B9的源数据中提取数量等于或大于30(>=30)的项目,并将结果按升序排列。
为此,我们首先在单元格E2中设置条件,例如,如下图所示。 然后,以这种方式建立我们的Excel SORT公式。
=SORT(FILTER(A2:B9, B2:B9>=E2), 2)
除了 阵列 由FILTER函数生成,我们只指定 排序_index 其余两个参数被省略了,因为默认值完全按照我们的需要工作(按行升序排序)。
获取N个最大或最小的值并对结果进行排序
在分析大量的信息时,经常需要提取一定数量的最高值。 也许不仅仅是提取,还要将它们按所需的顺序排列。 最好是选择在结果中包括哪些列。 听起来很棘手吗? 有了新的动态数组函数就不一样了
这里有一个通用的公式。
index(sort(...), sequence( n ), { column1_to_return , column2_to_return , ...})在哪里? n 是你想返回的值的编号。
从下面的数据集中,假设你想根据C列的数字得到一个前三名的名单。
要做到这一点,首先要对数组A2:C13按第三列降序排序。
排序(a2:c13, 3, -1)
然后,将上述公式嵌套在第一个( 阵列 )参数,使数组从大到小排序。
对于第二个( 行数_num 由于我们需要3个最高值,我们使用SEQUENCE(3),这与在公式中直接提供一个垂直数组常数{1;2;3}是一样的。
对于第三个( col_num )参数,它定义了要返回多少列,以水平数组常数的形式提供列号。 我们想返回B和C列,所以我们使用数组{2,3}。
最终,我们得到以下公式。
=index(sort(a2:c13, 3, -1), sequence(3), {2,3})
而且它产生的结果正是我们想要的。
返回 3底部 为此,请改变一下 排序_顺序 参数从-1到1。
=index(sort(a2:c13, 3, 1), sequence(3), {2,3})
返回一个特定位置的排序值
从另一个角度看,如果你只想返回一个特定的排序位置怎么办? 比如,只返回排序列表中的第1条、第2条或第3条记录? 要做到这一点,可以使用上面讨论的简化版INDEX SORT公式。
index(sort(...), n , { column1_to_return , column2_to_return , ...})在哪里? n 是感兴趣的位置。
例如,要从顶部获得一个特定的位置(即从数据降序排序),使用这个公式。
=index(sort(a2:c13, 3, -1), f1, {2,3})
要从底部获得一个特定的位置(即从数据中升序排序),请使用这个。
=index(sort(a2:c13, 3, 1), i1, {2,3})
其中A2:C13是源数据,F1是从顶部开始的位置,I1是从底部开始的位置,{2,3}是要返回的列。
使用Excel表格让排序阵列自动展开
正如你已经知道的,当你对原始数据做任何改变时,排序的数组会自动更新。 这是所有动态数组函数的标准行为,包括SORT。 然而,当你在引用的数组之外添加新条目时,它们不会自动包含在公式中。 如果你希望你的公式能对这种变化做出反应,将源范围转换成一个完全在你的公式中使用结构化引用。
为了了解它在实践中是如何运作的,请考虑以下例子。
假设你使用下面的Excel SORT公式,按字母顺序排列A2:B8范围内的数值。
=sort(a2:b8, 1, 1)
然后,你在第9行输入一个新的条目......并失望地看到新增加的条目被排除在溢出范围之外。
现在,将源范围转换为表,为此,只需选择包括列头(A1:B8)在内的范围,然后按Ctrl + T 。 在建立公式时,用鼠标选择源范围,表名将自动插入公式中(这被称为结构化引用)。
=SORT(Table1, 1, 1)
当你在最后一行的正下方输入一个新条目时,表格会自动展开,新的数据会被包含在SORT公式的溢出范围内。
Excel的SORT函数不工作
如果你的SORT公式出现了错误,很可能是因为以下原因。
#NAME错误:Excel的旧版本
SORT是一个新的函数,只在Excel 365和Excel 2021中工作。 在不支持这个函数的旧版本中,会出现#NAME? 的错误。
#SPILL错误:有东西阻挡了溢出范围
如果溢出区的一个或多个单元格没有完全空白或合并,就会显示#SPILL!错误。 要解决这个问题,只需清除堵塞物即可。 更多信息,请参见Excel #SPILL!错误--它意味着什么以及如何解决。
#VALUE错误:无效的参数
每当你遇到#VALUE!错误时,检查一下 排序_index 和 排序_顺序 争论。 排序_索引 不应超过列的数量是 阵列 ,以及 排序_顺序 应该是1(升序)或-1(降序)。
#REF错误:源工作簿已关闭
由于动态数组对工作簿之间的引用支持有限,SORT函数要求两个文件都是打开的。 如果源工作簿被关闭,公式将抛出一个#REF!错误。 要解决这个问题,只需打开被引用的文件。
这就是在Excel中使用公式对数据进行排序的方法。 感谢你的阅读,希望下周能在我们的博客上见到你!
供下载的实践工作手册
在Excel中用公式进行排序(.xlsx文件)