电脑教程
位置:首页>> 电脑教程>> office教程>> Excel公式:从多列中返回唯一且按字母顺序排列的列表

Excel公式:从多列中返回唯一且按字母顺序排列的列表

  发布时间:2022-08-24 05:03:28 

标签:excel公式怎么用,excel函数公式,excel常用函数,Excel教程

本次的练习是:如下图1所示,单元格区域A2:E5中包含一系列值和空单元格,其中有重复值,要求从该单元格区域中生成按字母顺序排列的不重复值列表,如图1中G列所示。

Excel公式:从多列中返回唯一且按字母顺序排列的列表

图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. 提取唯一值并按字母排序。

0
投稿

猜你喜欢

  • 电脑使用时间长了就会卡顿、响应缓慢,于是大多数人都会选择重装系统来修复电脑迟钝的问题。但是重装系统之后就会发现电脑开不了机了,到欢迎界面就一
  • 如图,是一份销售统计表,以饼图来反映数据,怎么在饼图上显示数据所占的百分比呢?具体的操作步骤如下:我们选中饼图,找到图表工具设计选项卡里的“
  • 在Word中,时常需要录入一些特殊的符号,比如万分号、钢筋符号等,一般是怎么操作呢?本期Word小编与大家分享相应的插入技巧。1、万分号的添
  • Corel WordPerfect Office X9是一款集多功能于一体的办公软件,本文主要针对WordPerfect Office X9
  • 有的比较心急的用户一般都会设置快速启动,在日常使用win10系统电脑时,应该有很多用户遇到过需要设置快速启动情况,那么win10系统电脑怎么
  • 误差线和趋势线是为了方便用户分析、处理数据及预测数据的走向和走势,而为word图表提供的一种功能。误差线与趋势线只能用在二维图表中,不能用在
  • 在Excel2010中新增加了COUNTIFS函数,很多朋友对此函数不是很了解,今天就为大家详细讲解Excel2010中COUNTIFS函数
  • 当我们安装新的软件的时候,新装的软件就会在开始屏幕中把原来的位置的软件给错开,打乱我们平时习惯使用的界面,很影响用户的使用,那如何锁定Win
  • Word2016怎么使用Alt键?Word2016中有很多技巧,今天我们就来看看Alt键的使用方法,很简单,但是很常用,需要的朋友可以参考下
  • word2003怎么将漂亮的符合设置为项目符号?word2003中为了让文章更清晰,往往我们会添加项目符号,怎么才能添加特殊的符号作为项目符
  • 例如我想到2013年3月2号後自动删除一个excel表格,在表格中建了个宏叫Macro1具体如下:Sub Macro1()Private S
  • 用户完成Word2003文档的编辑操作后即可关闭当前Word文档或退出Word2003程序。单击Word2003菜单栏右侧的“关闭”按钮、选
  • Word如何快速生成一段文本?有时候我们会用一大段文字来做一些功能测试,不少朋友的做法就是脸滚键盘,一顿乱按,这样看起来文笔不通,看着也会比
  • 偶尔删除表格方法不正确,删除后可能还留下一条线;这条线如果所使用的方法也不正确同样无法删除,至于怎么删除,文章将探讨具体的方法。那么下面就由
  • 在word文档中怎么设置文字换行和分页?很多朋友并不是很清楚,所以下面小编就为大家详细介绍一下,不会的朋友可以参考本文,希望能对大家有所帮助
  • 当您的EXCEL表格出现这样的错误对话框:“EXCEL隐含模块中的编译错误:设表格式”时,可能是由于如下的原因引起的。一、错误的宏代码表格中
  • excel表格打开以后不显示数据该怎么办?朋友发过来的excel命名有数据,但是打开以后什么数据都看不到,不显示表格,该怎么办呢?那是因为行
  • 我只想打印其中的一行,或者从第m行到第n行的数据,这如何实现呢?示例数据工作表、打印样式和要打印的表格模板工作表分别如下、和所示。将“数据”
  • Word2010书法字帖提供了田字格、田回格、九宫格、米字格、口字格等网格样式,用户可以根据自己的需要设置字帖的网格样式。在“书法”功能区中
  • 如何更改边框默认线条粗细?10 用Excel做出的表格,总觉得默认的表格边框线条太粗了(0.75磅),每次只能在“设置单元格格式”--“边框
手机版 电脑教程 asp之家 www.aspxhome.com