ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
12
返回列表 发新帖
楼主: qinjf6348

[求助] 哪位大神帮我详细解释一下这个公式:

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-4-2 23:43 | 显示全部楼层
你说的不重复的数值,我试了一下,结果不对吧
不重复.gif

TA的精华主题

TA的得分主题

发表于 2024-4-3 00:42 | 显示全部楼层
假设 A1:A14数据如下:
9
2
3
7
10
10
2
9
8
5
2
4
9
5

首先你拿的是第2个单元格的公式,第1个公式应该把ROW(A2) 改成 ROW(A1),如下:
=INDEX(A:A,SMALL(IF(MATCH(A$1:A$14,A:A,)=ROW($1:$14),ROW($1:$14),99),ROW(A1)))&""

建议把所有的“A:A”改成数据单元格区域“$A$1:$A$14”,以便分析数据
=INDEX($A$1:$A$14,SMALL(IF(MATCH(A$1:A$14,$A$1:$A$14,)=ROW($1:$14),ROW($1:$14),99),ROW(A1)))&""

使用wps查看函数范围时,只要单击一个函数的圆括号“()"内参数任意字符位置,该函数的函数名称和左右圆括号都将加粗显示,可以很明显看出一个公式中当前函数的范围,这样便于分析函数。excel好像没有这个功能,至少excel 2004没有这个功能,excel虽然有括号配对标记相同的颜色,但是当函数过多时,这个颜色很难区分,不如wps表格醒目。

分析最外层的INDEX函数,可以发现该函数有两个参数,即=INDEX(数组,行序号)
数组参数为:$A$1:$A$14
行序号为:SMALL(IF(MATCH(A$1:A$14,$A$1:$A$14,)=ROW($1:$14),ROW($1:$14),99),ROW(A1)),一眼看不出来,可以慢慢分析。

现在分析行序号:SMALL(IF(MATCH(A$1:A$14,$A$1:$A$14,)=ROW($1:$14),ROW($1:$14),99),ROW(A1))
对于SMALL函数,有两个参数,即=SMALL(数组,k)
数组参数为:IF(MATCH(A$1:A$14,$A$1:$A$14,)=ROW($1:$14),ROW($1:$14),99),一眼看不出来,可以慢慢分析。
k=ROW(A1)=1,表示提取数组中第1个最小的值。

现在分析数组参数为:IF(MATCH(A$1:A$14,$A$1:$A$14,)=ROW($1:$14),ROW($1:$14),99)
对于IF函数,这里有3个参数,=IF(条件表达式,真值,假值)
条件表达式:MATCH(A$1:A$14,$A$1:$A$14,)=ROW($1:$14)
真值:ROW($1:$14)
假值:99

现在分析条件表达式:MATCH(A$1:A$14,$A$1:$A$14,)=ROW($1:$14)
左边:
=MATCH(A$1:A$14,$A$1:$A$14,)
=MATCH({9;2;3;7;10;10;2;9;8;5;2;4;9;5},{9;2;3;7;10;10;2;9;8;5;2;4;9;5},) ,其作用是判断A$1:A$14这14个数字,在A$1:A$14单元格区域中分别排序第几位。注意,这里单元格区域转换为数组值,按下F9将无法计算,这里是为了分析数据
={1;2;3;4;5;5;2;1;9;10;2;12;1;10} 结果是数组,比如A1=9,在A1:A14,单元格区域中是第1个数,而A8=9,但是MATCH函数值找到第1个符合要求的就不找了,所以对应的结果也是1,这样重复的数字返回的序号都是相同的。

右边:ROW($1:$14)={1;2;3;4;5;6;7;8;9;10;11;12;13;14}

结合起来
MATCH(A$1:A$14,$A$1:$A$14,)=ROW($1:$14)
{1;2;3;4;5;5;2;1;9;10;2;12;1;10}={1;2;3;4;5;6;7;8;9;10;11;12;13;14},判断两遍数组各自对应位置的数值是否相等
{TRUE;TRUE;TRUE;TRUE;TRUE;FALSE;FALSE;FALSE;TRUE;TRUE;FALSE;TRUE;FALSE;FALSE} ,这样所有第2、3……个重复的数字结果中都显示未FALSE

带回if函数
=IF(MATCH(A$1:A$14,$A$1:$A$14,)=ROW($1:$14),ROW($1:$14),99)
=IF({TRUE;TRUE;TRUE;TRUE;TRUE;FALSE;FALSE;FALSE;TRUE;TRUE;FALSE;TRUE;FALSE;FALSE} ,ROW($1:$14),99)
=IF({TRUE;TRUE;TRUE;TRUE;TRUE;FALSE;FALSE;FALSE;TRUE;TRUE;FALSE;TRUE;FALSE;FALSE} ,{1;2;3;4;5;6;7;8;9;10;11;12;13;14},99)
={1;2;3;4;5;99;99;99;9;10;99;12;99;99}  ,这样所有第2、3……个重复的数字对应的序号都是99

将if结果带回small函数
=SMALL(IF(MATCH(A$1:A$14,$A$1:$A$14,)=ROW($1:$14),ROW($1:$14),99),ROW(A1))
=SMALL({1;2;3;4;5;99;99;99;9;10;99;12;99;99},ROW(A1))
=SMALL({1;2;3;4;5;99;99;99;9;10;99;12;99;99},1)
=1       

将small函数结果带回index函数
=INDEX($A$1:$A$14,SMALL(IF(MATCH(A$1:A$14,$A$1:$A$14,)=ROW($1:$14),ROW($1:$14),99),ROW(A1)))&""
=INDEX($A$1:$A$14,1)&""
=INDEX({9;2;3;7;10;10;2;9;8;5;2;4;9;5},1)&""
=9&""
=9

同理往下拖动,公式ROW(A1) 变为了 ROW(A2)=2,只影响了small函数的返回值,
SMALL({1;2;3;4;5;99;99;99;9;10;99;12;99;99},1)=1
SMALL({1;2;3;4;5;99;99;99;9;10;99;12;99;99},2)=2
SMALL({1;2;3;4;5;99;99;99;9;10;99;12;99;99},3)=3
SMALL({1;2;3;4;5;99;99;99;9;10;99;12;99;99},4)=4
SMALL({1;2;3;4;5;99;99;99;9;10;99;12;99;99},5)=5
SMALL({1;2;3;4;5;99;99;99;9;10;99;12;99;99},6)=10
SMALL({1;2;3;4;5;99;99;99;9;10;99;12;99;99},7)=12
SMALL({1;2;3;4;5;99;99;99;9;10;99;12;99;99},8)=99
SMALL({1;2;3;4;5;99;99;99;9;10;99;12;99;99},9)=99

在代入到index中如下:
INDEX({9;2;3;7;10;10;2;9;8;5;2;4;9;5},1)&""=9
INDEX({9;2;3;7;10;10;2;9;8;5;2;4;9;5},2)&""=2
INDEX({9;2;3;7;10;10;2;9;8;5;2;4;9;5},3)&""=3
INDEX({9;2;3;7;10;10;2;9;8;5;2;4;9;5},4)&""=7
……

INDEX({9;2;3;7;10;10;2;9;8;5;2;4;9;5},99)&""=“”        因为只有14个数,取第99个数,无引用数据,&“”,最后返回空值


TA的精华主题

TA的得分主题

发表于 2024-4-3 08:28 | 显示全部楼层
我不得不佩服这些作出详细解释的同志!向你们致敬。论坛里的每一位都是无私奉献的人。

TA的精华主题

TA的得分主题

发表于 2024-4-3 10:00 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
这是一个复杂的Excel公式,它使用了INDEX、SMALL、IF、MATCH和ROW函数的组合来查找并返回给定范围内的唯一值。现在我们一步步地进行分解:

MATCH(A$1:A$14, A:A):这个函数用于查找A$1:A$14范围内的值在A列中的位置。MATCH函数返回的是第一个匹配项的索引。

IF(MATCH(A$1:A$14, A:A) = ROW($1:$14), ROW($1:$14), 99):这个IF函数用于判断匹配到的行号是否等于当前处理的行号。如果是,则返回当前行号;如果不是,则返回一个大于范围内所有行号的数值(这里用99表示)。

SMALL(IF(MATCH(A$1:A$14, A:A) = ROW($1:$14), ROW($1:$14), 99), ROW(A2)):这个SMALL函数用于从上一步的IF函数结果中找出最小值。ROW(A2)表示当前公式所在的行号,这意味着每次向下拖动公式时,SMALL函数会查找小于上一行最小值的下一个最小值。

INDEX(A:A, SMALL(IF(MATCH(A$1:A$14, A:A) = ROW($1:$14), ROW($1:$14), 99), ROW(A2)))&“”:最后,INDEX函数根据SMALL函数找到的最小行号,在A列中查找相应的值。最后的结果是一个动态的唯一值。将整个公式与空字符串连接(&“”),以确保返回的值为文本格式。

总的来说,这个公式用于返回给定范围内A列的唯一值,当你向下拖动公式时,它会自动更新并返回下一个唯一的值。

TA的精华主题

TA的得分主题

发表于 2024-4-3 11:39 | 显示全部楼层

这个牛啊,是您手填的还是补丁一次性出来的?

TA的精华主题

TA的得分主题

发表于 2024-4-3 11:45 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
呃,个人建议升级版本,目前wps也免费
一个UNIQUE就可以解决你的问题

TA的精华主题

TA的得分主题

发表于 2024-4-3 11:46 | 显示全部楼层
这个公式是一个在Excel中使用的复杂组合公式,主要用于查找并返回满足特定条件的单元格的值。它结合了INDEX、MATCH、SMALL和IF等几个Excel内置函数,通常用于处理需要查找和返回多个唯一匹配项的情况。

公式解析:

`=INDEX(A:A,SMALL(IF(MATCH(A$1:A$14,A:A,)=ROW($1:$14),ROW($1:$14),99),ROW(A2)))&""`

1. `MATCH(A$1:A$14,A:A,)`:MATCH函数在这里用于查找A列中的值与A1到A14区域内的值之间的匹配位置。由于第三个参数为空,所以MATCH函数会寻找精确匹配。结果是一个数组,表示每个搜索值在A列中的相对位置或行号。

2. `IF(MATCH(A$1:A$14,A:A,)=ROW($1:$14),ROW($1:$14),99)`:IF函数基于MATCH函数的结果构建一个数组。如果MATCH函数找到匹配项(即A1到A14区域内的值在A列中的位置等于当前行号),则返回当前行号;否则返回99。这样可以筛选出所有匹配项所在的行号。

3. `SMALL(...,ROW(A2))`:SMALL函数用于从上述IF函数生成的数组中选择第ROW(A2)小的数值。这意味着随着公式向下填充时,它会依次返回下一个最小的行号(即下一个匹配项的位置)。

4. `INDEX(A:A,...)`:INDEX函数根据SMALL函数返回的行号,在A列中返回相应行的值。这就是最终我们想要得到的匹配项的值。

5. 最后的"&""": 这是为了将INDEX函数可能返回的数值转换为文本格式,并确保即使结果是数值型也能正确显示。

总结:此公式的作用是在A列中查找与A1至A14区域内所有重复出现过的值,并按照它们在A列中首次出现的顺序返回相应的值。当公式向下填充时,会逐行返回下一个未返回过的匹配项。

TA的精华主题

TA的得分主题

发表于 2024-4-3 11:49 | 显示全部楼层
我觉得 用公式 提取不重复的项 ,就是给自己找麻烦,如果出现公式错误很难发现。

建议对不常操作的活动,直接用软件的功能来实现。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-9-8 07:42 , Processed in 0.037926 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表