Excel中如何仅用公式合并两个命名列表并按升序排序?
不用VBA,纯公式实现Excel两列表合并并升序排列
当然可以!完全不需要VBA,用Excel自带的公式就能搞定这个需求,下面分两种主流场景给你具体方案:
一、适用于Excel 365/2021(支持动态数组)
这个版本的Excel有强大的动态数组函数,操作超简单:
直接在任意空白单元格输入以下公式,它会自动溢出填充成完整的排序后列表:
=SORT(VSTACK(List1, List2))
VSTACK(List1, List2):把List1和List2垂直堆叠合并成一个新的数组;SORT():对合并后的数组按升序排序,正好得到你想要的AA、BB、CC、DD、EE、FF、GG结果。
如果你的列表里可能存在重复值,想要去重后再排序,只需加个UNIQUE()函数:
=SORT(UNIQUE(VSTACK(List1, List2)))
二、适用于旧版Excel(无动态数组,如2019及更早)
旧版没有动态数组函数,需要用数组公式来实现,步骤如下:
- 先计算两个列表的总条目数:
=COUNTA(List1)+COUNTA(List2),对应你的例子结果是7; - 在第一个目标单元格(比如C1)输入以下数组公式,然后按下
Ctrl+Shift+Enter(注意不是单独按Enter):
=IFERROR(INDEX( IF(ROW($1:$100)<=COUNTA(List1), INDEX(List1,ROW($1:$100)), INDEX(List2,ROW($1:$100)-COUNTA(List1))), MATCH( SMALL( IF(ROW($1:$100)<=COUNTA(List1), CODE(INDEX(List1,ROW($1:$100))), CODE(INDEX(List2,ROW($1:$100)-COUNTA(List1)))), ROW(A1) ), IF(ROW($1:$100)<=COUNTA(List1), CODE(INDEX(List1,ROW($1:$100))), CODE(INDEX(List2,ROW($1:$100)-COUNTA(List1)))), 0 ) ), "")
- 把这个单元格下拉填充到第7行(总条目数),就能得到完整的排序后列表。
公式说明:
IF(ROW($1:$100)<=COUNTA(List1),...):先构建一个包含List1和List2所有内容的虚拟合并数组;CODE():把文本转换成对应的ASCII码,方便排序比较;SMALL(...,ROW(A1)):依次提取排序后的ASCII码值;MATCH()找到对应值的位置,最后用INDEX()提取文本,IFERROR()用来隐藏超出条目数后的错误值。
内容的提问来源于stack exchange,提问作者Michael




