excelhomesofa 发表于 2012-8-20 18:27
这个附件已经更新并变化了;但是有些疑问,请看附件行取重复值3
关于《附件行取重复值3》解法4,=INDEX(2:2,SMALL(IF((COUNTIF($G$2:$P$2,$G$2:$P$2)>1)*((MATCH($G$2:$P$2&"",$G$2:$P$2&"",)+COLUMN($F:$F))=COLUMN($G:$P)),COLUMN($G:$P),256),COLUMN(A:A)))&""解读一下:
1、附件中你声称已经理解(COUNTIF($G$2:$P$2,$G$2:$P$2)>1)*((MATCH($G$2:$P$2&"",$G$2:$P$2&"",)+COLUMN($F:$F))=COLUMN($G:$P))这一段,那就比较简单了,这一段用左键抹黑点F9,得到{1,0,0,1,1,0,0,0,0,0}——即得到$G$2:$P$2中重复的数据第一次出现的位置,——用这个常数数组代入到公式中去,理解起来方便多了。
2、IF({1,0,0,1,1,0,0,0,0,0},COLUMN($G:$P),256)——把重复数第一次出现的列标序号返回出来,不是第一次出现的赋以256,得到{7,256,256,10,11,256,256,256,256,256};
3、SMALL(IF({1,0,0,1,1,0,0,0,0,0},COLUMN($G:$P),256),COLUMN(A:A))——此处COLUMN(A:A)等于1,把上面2、中得到的数组中第1小的数,即第一个重复数据的列标序号7提取了出来。(右拖后COLUMN(A:A)变成COLUMN(B:B)、COLUMN(C:C)……即右拖得到2、3……,用SMALL依次提取第2小、第3小……的列标序号10、11提取出来);
4、=INDEX(2:2,SMALL(IF(({1,0,0,1,1,0,0,0,0,0},COLUMN($G:$P),256),COLUMN(A:A)))——在第2行中把第一个符合条件(第一个首次出现重复数的列标序号7)的数据6提取出来;
5、&""——不是可有可无,如果说事先知道只有三个重复数,而且只向右拉三列,的确可以不要&"",但是在不知情的情况下,多右拖几列,没有&"",则便出现0值,用了这个&"" ,就把0屏蔽掉了。(问题是a、如果源数据中0也是重复值并需要被考虑的话,却也被屏蔽掉了;b、用了&"" ,原来是数值型变成了文本型了)
|