Excel SORT函数--使用公式自动排序数据

  • Share This
Michael Brown

本教程展示了如何使用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文件)

    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.