网上很多vba去除重复项的经验,但是大多都要使用到字典,其实可以巧用split函数来实现这一个功能。设计思路:使用like作为判断,遍历所有单元格,把不重复值连成一个有特定符号隔开的字串,然后用split函数将字串转化成数组。缺陷:受到字串变量长度限制,如果样本量很大,而且每个不重复值的长度又很长,可能就会报错。
工具/原料
EXCEL
VBA
方法/步骤
1、假设A列是我们要处理的数据,包含了重复的项目,我们要把这些重复的项目剔除掉,然后贴在C列上。
2、我们蚤疣毖扒依旧按下熟悉的alt+f11进入vbe编辑器,新建一个模块输入代码:Sub提取唯一值()DimRngAsRangeDimStrAsStri荏鱿胫协ngDimEndRowNoAsIntegerEndRowNo=Range("A1").End(xlDown).Row'找出A列最大行数ForEachRngInRange("A2:A"&EndRowNo)'遍历A列每一个单元,如果没有和之前的值重复则合并到Str里去,并用“/”隔开IfNotStrLike"*"&Rng&"*"Then'用Notlike判断值是否已经合并过Str=Str&"/"&RngEndIfNextStr=VBA.Mid(Str,2,Len(Str))'把生成的字符串中第一个“/”号去掉Dimarrarr=Split(Str,"/")'使用split函数生成数组,这个数组内的元素就是我们要找的唯一值了Range("c2:c"&UBound(arr)+2)=WorksheetFunction.Transpose(arr)'把生成的数组贴到目标区域EndSub
3、我们回到刚才的表格,把vbe编辑器缩小,并按下运行键,我们就可以看到唯一值就提取到C列中去了。
4、最后方便大家理解解释一下代码:Di葡矩酉缸marr声明不定数组的方式,不需要加上arr()split函数可以将字串按某分割符号转姝耒匝揎化成数组,代码中“/”符号,可以替换成其他的符号UBound(arr)+2UBound找出的是数组的最大下标,但数组的索引是从0开始的,所以实际元素的数量要加上1,然后C列是从第二行开始黏贴的,所以又要加上1,所以C列的行数就是数组的最大下标+2了。WorksheetFunction.Transpose(arr)单元格黏贴数组的时候,默认一维数组是“行”的形式,如range("a1:g1"),但我们的目标是C列,为列的形式,所以我们要用这个Transpose函数转化数组,否则会报错哦。