...说数据是从第二行开始.在C2输入以下内容:=I
编辑: admin 2017-24-02
-
4
首先要明白数组公式是什么,这里就不多说了.
下面你需要通过一步一步实际操作来理解这个函数的意思,按你的例子,将
姓名
张三
李四
王五
王五
赵六
张三
放到A1至A7,剩下的数据先不用.
(一) MATCH函数
鼠标左键点B2,然后拖到B7,在上面的输入栏输入=MATCH($A$2:$A$7,$A$2:$A$7,0),然后ctrl+shift+enter,你会得到以下结果:
姓名\x05
张三\x051
李四\x052
王五\x053
王五\x053
赵六\x055
张三\x051
这一步的意思就是在A2:A7中分别匹配A2至A7,将第一次出现的值的相对位置返回.所以重复的值,如张三,会返回第一次出现时的相对位置.
(二)用IF函数判断第一步中返回的值是否等于行号-1
鼠标左键点C2,然后拖到C7,在上面的输入栏输入=IF(MATCH($A$2:$A$7,$A$2:$A$7,0)=ROW($A$2:$A$7)-1,ROW($A$2:$A$7)-1,4^8),然后ctrl+shift+enter,你会得到以下结果:
姓名\x05\x05
张三\x051\x051
李四\x052\x052
王五\x053\x053
王五\x053\x0565536
赵六\x055\x055
张三\x051\x0565536
因为你提供的数据是有标题行的,真正的数据是从第二行开始,所以需判断是否等于ROW($A$2:$A$7)-1.如果相等了,则返回行号-1,如果不相等,说明有重复,则返回4的8次方,在这里4^8是随便指定的一个比较大的数字,你可以随便更换,但一定要大于你提供的数据的数目,本例是6,也就是说本例一定要大于6.
这一步做完后,第一次出现的数据都会返回行号-1,而重复出现的数据则会返回65536.
(三)用SMALL函数为第三列排序
鼠标左键点D2,然后拖到D7,在上面的输入栏输入=SMALL(IF(MATCH($A$2:$A$7,$A$2:$A$7,0)=ROW($A$2:$A$7)-1,ROW($A$2:$A$7)-1,4^8),ROW($A$2:$A$7)-1),然后ctrl+shift+enter,你会得到以下结果:
姓名\x05\x05\x05
张三\x051\x051\x051
李四\x052\x052\x052
王五\x053\x053\x053
王五\x053\x0565536\x055
赵六\x055\x055\x0565536
张三\x051\x0565536\x0565536
SMALL函数的意思是返回一个数组中第几小的数,具体用法自己查,在本例中是依次返回第三列中第1小至第6小的数.
这步的作用就是将不重复数据的行号都集中到前面,为最后一步INDEX函数做准备.
(四)最后用INDEX函数得到结果
在E2中输入=INDEX($A$2:$A$7,SMALL(IF(MATCH($A$2:$A$7,$A$2:$A$7,0)=ROW($A$2:$A$7)-1,ROW($A$2:$A$7)-1,4^8),ROW(A2)-1),1),然后ctrl+shift+enter,会得到"张三",
这一步中的ROW(A2)-1的结果是1,所以这一步的意思是返回第四列中第1小的值,这个值其实就是行号1,再用INDEX函数找到第一列中行号1对应的值,也就是张三.
注意,这里的ROW(A2)-1一定要是相对引用,这样你往下拖时,就变成了ROW(A3)-1,也就是2,然后对应的就是李四.
这样一直往下拖,不重复的数就都选出来了,当拖到E6时,这时找的是第四列中第5小的数,也就是65536,然后对应的去找第一列中的第65536行,那肯定是找不到的,因此就#REF!了.
原函数中有一些&"",这个是将数字转换成字符的,在本例中没用,所以上面的讲解都没加.
至此,这个函数就讲完了.我第一次看这个函数的时候也研究了好长时间.
第一个写这个函数的人还是比较牛X的.
一点一点用键盘敲的,希望能给你帮助,如有问题,给我留言吧.
类似问题
类似问题1:数学函数的fx到底什么意思,简单讲解一下[数学科目]
f是英文单词fuction的首字母,意为函数.表明函数关系.括号中的x则表示此函数的自变量为x.
类似问题2:IF函数解析含义选择单元格Z6输入“=IF(LEN($I6*100)>=10,MIDB($I6*100,LEN($I6*100)-9,1),"")”
=IF(LEN($I6*100)>=10,MIDB($I6*100,LEN($I6*100)-9,1),"")
条件:LEN($I6*100)>=10
当条件成立时,Z6=MIDB($I6*100,LEN($I6*100)-9,1);
当条件不成立时,Z6="" (空白).
条件里的函数含义:I6单元格的数据乘以100后所得数据的长度.
条件的含义是:I6单元格的数据乘以100后所得数据的长度大于等于10.
函数MIDB($I6*100,LEN($I6*100)-9,1)的含义:对“I6单元格的数据乘以100后所得数据”从该数据的长度减去9的那位数字开始,取一位数字.
例如:I6=12345678 (共8位数)
I6*100后得到:1234567800(共10位数),符合>=10的条件,因此Z6取得从10位-9位=1位,即从第一位数“1”开始,取一位数,这个数就是1,亦即:Z6=1
类似问题3:C++ try catch 函数的含义及用法,以及分析下面的函数BOOL CChannels::OpenMapFile(){try{if( m_File.Open( m_sMapFileName,CFile::modeRead ) ){CString sBuf;sBuf.Format( "Can't open %s file",m_sMapFileName );AfxMessageBox( sBuf );return FALSE
try catch为异常处理的一种模式.在你上面的代码中,在try模块里如果m_File.Open操作失败就会抛出异常代码(可以在MSDN里面有写),这时候catch模块就会捕捉这个异常,如果捕捉到,就会进行catch模块中的相应处理,在你上面就是进行 CString sBuf;
sBuf.Format( "Can't open %s file",m_sMapFileName );
AfxMessageBox( sBuf )
不知道说明白没
类似问题4:求每一步的详解,为什么用这函数.#include "stdio.h"#include "string.h"struct student{char birthday[20];char name[20];char telephone[20];char address[20];}stu[50];int k=0;void input();void paixu();void outputgrade();void main(){input();paix
程序定义了一个学生的数据结构,包括生日、姓名、电话、地址;
定义了全局变量stu[50];可以最多输入50个学生的信息;和全局整形变量k=0;
定义了三个程序:input(),paixu(),outputgrade();功能分别是输入学生信息、按生日进行排序、输出学生信息;输入学生信息的时候输完一个后可以选择y/n来是否继续输入下一个;
主程序按照输入--排序--输出的顺序调用三个程序.
类似问题5:c程序如何调用主函数下面定义的函数,int main(void){double nxx,nyy,nxy,alnn; double Omi2 ;lam0=c12; mu0=c44 ; nu0=c11;Omi2=(-1)*(lam0+mu0)/((lam0+2*mu0)*mu0)*(lam0+2*mu0)*nyy;printf("Omi2= %f \n",Omi2);for(i=0;i
你这里nyy在main一开始就申请了啊,你是要在Omi2使用下面循环内nyy计算的结果吗?如果是这样,调整下逻辑不行吗?先计算nyy,再计算Omi2.
代码太凌乱了,可以定义2个宏,分别计算nxx、nyy和Omi2、Z12ep.