Excel公式:从多列中返回唯一且按字母顺序排列的列表
发布时间:2022-08-24 05:03:28
本次的练习是:如下图1所示,单元格区域A2:E5中包含一系列值和空单元格,其中有重复值,要求从该单元格区域中生成按字母顺序排列的不重复值列表,如图1中G列所示。
图1
在单元格G1中编写一个公式,下拉生成所要求的列表。
先不看答案,自已动手试一试。
公式
在单元格G1中的公式为:
=IF(ROWS($1:1)>$H$1,””,INDEX(Arry4,MATCH(SMALL(IF(FREQUENCY(IF(Range1<>””,MATCH(Range1,Arry4,0)),Arry1),COUNTIF(Range1,”<“&Arry4)),ROWS($1:1)),IF(Arry4<>””,COUNTIF(Range1,”<“&Arry4)),0)))
下拉直至出现空单元格为止。
在单元格H1中的公式为:
=SUMPRODUCT((Range1<>””)/COUNTIF(Range1,Range1&””))
公式中使用了5个名称,分别为:
名称:Range1
引用位置:=$A$2:$E$5
名称:Arry1
引用位置:=ROW(INDIRECT(“1:”&COLUMNS(Range1)*ROWS(Range1)))
名称:Arry2
引用位置:=1+INT((Arry1-1)/COLUMNS(Range1))
名称:Arry3
引用位置:=1+MOD(Arry1-1,COLUMNS(Range1))
名称:Arry4
引用位置:=INDEX(Range1,N(IF(1,Arry2)),N(IF(1,Arry3)))
公式解析
1. 在单元格H1中的公式比较直接,是一个获取列表区域唯一值数量的标准公式:
=SUMPRODUCT((Range1<>””)/COUNTIF(Range1,Range1&””))
转换为:
=SUMPRODUCT(({“Due”,””,”Otto”,””,”Otto”;””,””,””,””,”Tre”;”Sei”,”Cinque”,””,”Quattro”,”Otto”;”Due”,””,””,”Quattro”,”Otto”}<>””)/COUNTIF(Range1,Range1&””))
转换为:
=SUMPRODUCT({TRUE,FALSE,TRUE,FALSE,TRUE;FALSE,FALSE,FALSE,FALSE,TRUE;TRUE,TRUE,FALSE,TRUE,TRUE;TRUE,FALSE,FALSE,TRUE,TRUE}/COUNTIF(Range1,Range1&””))
接着解析COUNTIF部分,该部分计算Range1中每个条目在该区域内出现的次数:
=SUMPRODUCT({TRUE,FALSE,TRUE,FALSE,TRUE;FALSE,FALSE,FALSE,FALSE,TRUE;TRUE,TRUE,FALSE,TRUE,TRUE;TRUE,FALSE,FALSE,TRUE,TRUE}/{2,9,4,9,4;9,9,9,9,1;1,1,9,2,4;2,9,9,2,4})
除法运算后:
=SUMPRODUCT({0.5,0,0.25,0,0.25;0,0,0,0,1;1,1,0,0.5,0.25;0.5,0,0,0.5,0.25})
结果为:
6
2. 在单元格G1的主公式中:
=IF(ROWS($1:1)>$H$1,””,
如果公式向下拖拉的行数超过单元格H1中的数值6,则返回空值。
3. 下面重点看看公式中的:
INDEX(Arry4,MATCH(SMALL(IF(FREQUENCY(IF(Range1<>””,MATCH(Range1,Arry4,0)),Arry1),COUNTIF(Range1,”<“&Arry4)),ROWS($1:1)),IF(Arry4<>””,COUNTIF(Range1,”<“&Arry4)),0))
实际上,这是提取唯一且按字母顺序排列的值的标准公式构造,唯一区别是提取值的区域不是单列、一维区域,而是二维区域。然而,在原理上该技术是相同的:首先将二维区域转换成一维区域,然后应用通用的结构来获取我们想要的结果。
上述公式构造中的Arry4为:
INDEX(Range1,N(IF(1,Arry2)),N(IF(1,Arry3)))
这里,只是简单地索引二维区域中的每个元素。然而,我们得到的结果数组将是一维数组且包含的元素与二维区域中的元素完全相同。
为了解构Arry4,我们需要首先查看Arry2和Arry3,它们分别对应着INDEX函数的参数row_num和参数column_num。而它们都引用了Arry1:
=ROW(INDIRECT(“1:”&COLUMNS(Range1)*ROWS(Range1)))
名称Range1代表的区域有4行5列,因此转换为:
ROW(INDIRECT(“1:”&5*4))
得到:
{1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20}
再看Arry2:
=1+INT((Arry1-1)/COLUMNS(Range1))
转换为:
1+INT(({1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20}-1)/5)
转换为:
1+INT({0;1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19}/5)
转换为:
1+INT({0;0.2;0.4;0.6;0.8;1;1.2;1.4;1.6;1.8;2;2.2;2.4;2.6;2.8;3;3.2;3.4;3.6;3.8})
转换为:
1+{0;0;0;0;0;1;1;1;1;1;2;2;2;2;2;3;3;3;3;3}
得到:
{1;1;1;1;1;2;2;2;2;2;3;3;3;3;3;4;4;4;4;4}
接着看Arry3:
=1+MOD(Arry1-1,COLUMNS(Range1))
转换为:
1+MOD({0;1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19},5)
转换为:
1+{0;1;2;3;4;0;1;2;3;4;0;1;2;3;4;0;1;2;3;4}
得到:
{1;2;3;4;5;1;2;3;4;5;1;2;3;4;5;1;2;3;4;5}
再回到Arry4。可以转换为:
INDEX(Range1,N(IF(1,{1;1;1;1;1;2;2;2;2;2;3;3;3;3;3;4;4;4;4;4})),N(IF(1,{1;2;3;4;5;1;2;3;4;5;1;2;3;4;5;1;2;3;4;5})))
这里使用了强制INDEX返回数组的技术,详情可参阅《Excel公式技巧03:INDEX函数,给公式提供数组》。上述公式可转换为:
INDEX(Range1,{1;1;1;1;1;2;2;2;2;2;3;3;3;3;3;4;4;4;4;4},{1;2;3;4;5;1;2;3;4;5;1;2;3;4;5;1;2;3;4;5})
现在应该可以看清楚为INDEX函数的每个参数传递数组的原因了,因为上述公式等价于执行下列每个公式:
INDEX(Range1,1,1)
INDEX(Range1,1,2)
INDEX(Range1,1,3)
INDEX(Range1,1,4)
INDEX(Range1,1,5)
INDEX(Range1,2,1)
INDEX(Range1,2,2)
…
INDEX(Range1,4,5)
因此,Arry4的结果为:
{“Due”;””;”Otto”;””;”Otto”;””;””;””;””;”Tre”;”Sei”;”Cinque”;””;”Quattro”;”Otto”;”Due”;””;””;”Quattro”;”Otto”}
而Excel将Range1解析为:
{“Due”,””,”Otto”,””,”Otto”;””,””,””,””,”Tre”;”Sei”,”Cinque”,””,”Quattro”,”Otto”;”Due”,””,””,”Quattro”,”Otto”}
我们可以看到这两个数组中的值没有任何区别。唯一不同的是,Range1包含一个4行5列的二维数组,而Arry4是通过简单地将Range1中的每个元素进行索引而得出的,实际上是20行1列的一维区域。
好了,现在就可以使用我们掌握的常用的适用于一维区域的技术来操作该数组了!
4. 再看看主公式中的:
INDEX(Arry4,MATCH(SMALL(IF(FREQUENCY(IF(Range1<>””,MATCH(Range1,Arry4,0)),Arry1),COUNTIF(Range1,”<“&Arry4)),ROWS($1:1)),IF(Arry4<>””,COUNTIF(Range1,”<“&Arry4)),0))
先看看这部分:
IF(Range1<>””,MATCH(Range1,Arry4,0))
转换为:
IF({TRUE,FALSE,TRUE,FALSE,TRUE;FALSE,FALSE,FALSE,FALSE,TRUE;TRUE,TRUE,FALSE,TRUE,TRUE;TRUE,FALSE,FALSE,TRUE,TRUE},MATCH(Range1,Arry4,0))
使用Range1和Arry4替换,得到:
IF({TRUE,FALSE,TRUE,FALSE,TRUE;FALSE,FALSE,FALSE,FALSE,TRUE;TRUE,TRUE,FALSE,TRUE,TRUE;TRUE,FALSE,FALSE,TRUE,TRUE},MATCH({“Due”,””,”Otto”,””,”Otto”;””,””,””,””,”Tre”;”Sei”,”Cinque”,””,”Quattro”,”Otto”;”Due”,””,””,”Quattro”,”Otto”},{“Due”;””;”Otto”;””;”Otto”;””;””;””;””;”Tre”;”Sei”;”Cinque”;””;”Quattro”;”Otto”;”Due”;””;””;”Quattro”;”Otto”},0))
可转换为:
IF({TRUE,FALSE,TRUE,FALSE,TRUE;FALSE,FALSE,FALSE,FALSE,TRUE;TRUE,TRUE,FALSE,TRUE,TRUE;TRUE,FALSE,FALSE,TRUE,TRUE},{1,#N/A,3,#N/A,3;#N/A,#N/A,#N/A,#N/A,10;11,12,#N/A,14,3;1,#N/A,#N/A,14,3})
得到:
{1,FALSE,3,FALSE,3;FALSE,FALSE,FALSE,FALSE,10;11,12,FALSE,14,3;1,FALSE,FALSE,14,3}
这个数组是FREQUENCY函数的第一个参数,而Arry1是其第二个参数:
FREQUENCY(IF(Range1<>””,MATCH(Range1,Arry4,0)),Arry1)
可转换为:
FREQUENCY({1,FALSE,3,FALSE,3;FALSE,FALSE,FALSE,FALSE,10;11,12,FALSE,14,3;1,FALSE,FALSE,14,3},Arry1)
将Arry1代入:
FREQUENCY({1,FALSE,3,FALSE,3;FALSE,FALSE,FALSE,FALSE,10;11,12,FALSE,14,3;1,FALSE,FALSE,14,3},{1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20})
生成数组:
{2;0;4;0;0;0;0;0;0;1;1;1;0;2;0;0;0;0;0;0;0}
这是我们使用的相当标准的技术:上述数组中非零值的位置表示在该区域内每个不同值在该数组中的首次出现,因此提供了一种仅返回唯一值的方法。将该数组作为IF函数的条件:
IF(FREQUENCY(IF(Range1<>””,MATCH(Range1,Arry4,0)),Arry1),COUNTIF(Range1,”<“&Arry4))
转换为:
IF({2;0;4;0;0;0;0;0;0;1;1;1;0;2;0;0;0;0;0;0;0},COUNTIF(Range1,”<“&Arry4))
COUNTIF函数用于确定字母排序:
IF({2;0;4;0;0;0;0;0;0;1;1;1;0;2;0;0;0;0;0;0;0},{1;0;3;0;3;0;0;0;0;10;9;0;0;7;3;1;0;0;7;3})
结果为:
{1;FALSE;3;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;10;9;0;FALSE;7;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE}
这样,INDEX函数部分现在变成:
INDEX(Arry4,MATCH(SMALL({1;FALSE;3;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;10;9;0;FALSE;7;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE},ROWS($1:1)),IF(Arry4<>””,COUNTIF(Range1,”<“&Arry4)),0))
对于SMALL函数,其参数k的值由ROWS($1:1)指定,在单元格G1中为1,因此上述公式转换为:
INDEX(Arry4,MATCH(0,IF(Arry4<>””,COUNTIF(Range1,”<“&Arry4)),0))
转换为:
INDEX(Arry4,MATCH(0,IF(Arry4<>””,{1;0;3;0;3;0;0;0;0;10;9;0;0;7;3;1;0;0;7;3},0))
转换为:
INDEX(Arry4,MATCH(0,{1;FALSE;3;FALSE;3;FALSE;FALSE;FALSE;FALSE;10;9;0;FALSE;7;3;1;FALSE;FALSE;7;3},0))
转换为:
INDEX(Arry4,12)
将Arry4代入:
INDEX({“Due”;””;”Otto”;””;”Otto”;””;””;””;””;”Tre”;”Sei”;”Cinque”;””;”Quattro”;”Otto”;”Due”;””;””;”Quattro”;”Otto”},12)
得到结果:
Cinque
小结:
本文至少复习/使用了以下公式技术:
1. 统计列表区域中唯一值数量。
2. 将二维区域转换成一维区域。
3. 强制INDEX返回数组。
4. 确定字母排序。
5. 提取唯一值并按字母排序。


猜你喜欢
- Win11怎么查看分区格式?最近有用户反映这个问题,磁盘分区格式有mbr和gpt两种,有些用户不知道怎么查看,针对这一问题,本篇带来了详细的
- 经常在使用Excel表格时,肯定对表格那从没有变化过的白底背景产生了一定的厌恶,常常感慨为什么不能多一点新意呢?其实我们可以为Excel表格
- 445端口4是一个TCP的端口,有了它我们可以在局域网中轻松访问各种共享文件夹或共享打印机,但也正是因为有了它,黑客们才有了可乘之机。因此有
- 软公司宣布,Windows 10 今日正式发布,用户可以以免费升级或购买预装 Windows 10 的新 PC 和平板电脑的方式获取 Win
- 上面这个题目,就是典型的lookup返回最后一个数据的应用。我们输入公式:=LOOKUP("座",B:B)&
- word2003文档中怎么输入除法符号÷?word文档中需要输入除法符号,每次输入都变成了斜杠/,该怎么办呢?下面我们就来看看除法符号÷的两
- Win10开机输入密码比较麻烦,相信很多安装Win10的朋友,都会觉得每次开机都需要输入密码比较麻烦,下面与大家分享下取消Win10开机密码
- 好用的办公软件工具推荐对于小编来说,我的电脑中一定少不了资源传输、文件管理、截图类工具,毕竟天天会用到。最近有小伙伴让我分享几款日常办公中必
- 亿图脑图MindMaster,也就是我们经常说的MindMaster,是很多小伙伴都在使用的一款软件,在其中我们可以根据自己的实际需要创建各
- win10系统是一款非常智能的高性能系统!因为舒适的体验感和各种优秀的智能技术使得选择使用win10系统的用户们也是所有电脑系统用户中数量最
- 现在,不少人都在使用excel2010这个软件。而有的用户就在问,Excel2010怎么插入单元格、行和列?今天小编旧为大家介绍一下Exce
- 韩博士u盘重装系统步骤win7教程,win7系统相对于win10系统,更加的稳定可靠,而且也很适合低配置的电脑安装,所以还有不少用户重装的时
- ppt怎么全程播放音乐?在进行ppt幻灯片展示的过程中,好的文档内容再加上好的背景音乐,能让整个文档更吸引用户,那背景音乐要怎么设置全程播放
- CHIDIST函数用于返回χ2分布的单尾概率。χ2分布与χ2检验相关,使用χ2检验可以比较观察值和期望值。例如,某项遗传学实验假设下一代植物
- 很多用户升级Win10 1909系统的用户反映,他们的播放设备无法正常工作了。那么Win10无法播放设备怎么办呢?其实这很大可能是由于系统在
- win7系统安装IE10浏览器失败该怎么办?为了在win7系统上享受到更快更流畅的浏览体验,用户纷纷更换上IE10浏览器,但是在安祖昂的时候
- 今天微软推送了Win10重大更新Redstone预览版11082,这也是Redstone更新第一波RS1分支的首个预览版,但是该怎么更新呢?
- 1.当然,首先咱们必须要确保的是,咱们的外接设备,硬件设备,也就是咱们的话筒本身是好的,如果是因为话筒本身坏了而造成的故障的话,那么就需要重
- 360安全卫士是一款在电脑系统下的安全辅助软件,拥有着木马查杀、电脑清理以及系统修复等功能,很好的为用户解决了电脑中所存在的健康问题,也为用
- 在我们使用excel2003查看表格数据的时候,把表格变成柱形图更能明晰的了解各项数据,我们该如何制作这种图表呢?下面随小编一起看看吧。ex