去除重复数据。 先把列子传上来
原数据 生成数据 西侠 | | 西侠 | 西侠 | 东侠 | 东侠 | 西侠 | 泥腿僧 | 泥腿僧 | 北侠 | 北侠 | 横推八百无人敌 | 横推八百无人敌 | 震八方紫面昆仑侠 | 震八方紫面昆仑侠 | 南侠 | 西侠 | 光芒万丈无人敌满洲首剑 | 南侠 | 神剑惊天 | 震八方紫面昆仑侠 | #NUM! | 震八方紫面昆仑侠 | #NUM! | 光芒万丈无人敌满洲首剑 | #NUM! | 西侠 | #NUM! | 东侠 | #NUM! | 横推八百无人敌 | #NUM! | 北侠 | #NUM! | 横推八百无人敌 | #NUM! | 光芒万丈无人敌满洲首剑 | #NUM! | 光芒万丈无人敌满洲首剑 | #NUM! | 东侠 | #NUM! | 北侠 | #NUM! | 泥腿僧 | #NUM! |
我们先把需求分析清楚:我们是要把红色A列数据进行减肥(把重复的数据去掉)生成到B列。 但我们怎么给EXCEL下指令呢?我们开始一般没有思路(除非这个问题很简单 OR 你已经多次接触熟悉了),那 我们就先自己这台运算速度慢但超智能的生物脑先运行一下:在B1自然是A1,那么B2呢,我们从A列中去找这样 的元素,这个元素在B列当前区域没有出现过,然后把这个数据添到B列最后一格B2。然后B3,通过和刚才差不多 的过程我们在数据A列中找到一个元素,他在当前B列区域(B1:B2)没有出现过,把他放到B3。这样我们如果把 BN加上数据了,那么在B(N+1)我们也能按上面的逻辑给他选择数据直到在A列中没有这样的数据为止。 这个过程为我们产生灵感。 具体实施如下: 步骤1:定义名称 DATAA=OFFSET(A1,,,COUNTA(A:A),1),效果就是用DATAA就能表示数据A列的数据区域 步骤2:人工"跑"一边,看看应该是怎么样的逻辑关系。 1.动态定义B列数据 Mdatab=$B$1:$B(n-1). 在DATAA中取一个数据,看看他在B列中有没有,如果没有那么把她放入B列,如果有那么把她舍弃。 这里可以看出这里的B列是动态的,比如我们现在要决定BN中放什么数据的时候她的B列当前区域就 是B1:B(N-1),我们根据这个定义动态B列数据区域Mdatab=$B$1:$B(n-1). 2.在A列选元素时的核心表达:BX=IF(COUNTIF(MDATAB,DATAA)>0,"",ROW(DATAA)) 逻辑过程表达:BX=IF(COUNTIF(MDATAB,DATAA)>0,"",ROW(DATAA)) 通过这个核心表达式我们把需要的坐标(行号选出来了),然后的逻辑就是把DATAA中对应的这些 数据挑出来。 BX=IF(COUNTIF(MDATAB,DATAA)>0,"",ROW(DATAA)),这个过程就是把DATAA的每个数据到 DATAB中去查找,如果发现能找到--COUNTIF()>0,那么不记录他的行号,否则把他的行号记录下来(row(dataa)). 这样IF函数生成的数组输出就是这么一个行数组,元素要么是"",要么是 行号 row(dataa中对应的元素)。我们在B列需要 的数据在A中的行号就全部聚合在这个数组里面了。接下去我们就是要去罗列出这些数据。 对于数组公式我是这么去理解的,一个输入就有一个输出,数组输入自然就是数组输出,输出数组的每个元素就是输入输 入的每个元素对应的函数值,输出输入以行数组的形式存在。 3。罗列需要的数据 FuncInColumnB=INDEX(DATAA,SAMLL(BX,1)), INDEX(DATAA,SAMLL(BX,1)),我把她记做FuncInColumnB,这里要注意的是BX的内容是变化的,因为MDATAB是变化的。 步骤3。想美化,把#NUM!去掉,可以给公式一个外套:if(iserror(FuncInColumnB),"",FuncInColumnB)
q9jutcaA.zip
(5.01 KB, 下载次数: 65)
[此贴子已经被作者于2007-8-16 15:35:27编辑过] |