Excel VBA 7.29多列数据去重,Excel自带重复项只能单列?怎么破?
一起学习,一起进步~~
昨天我们分享了在进行数据合并的过程中,如何同时进行去重的操作,这对于小伙伴们日常的操作是有很大的帮助的,毕竟Excel自带的重复项高亮功能也只能针对一列,并且没有办法跨工作表,我们可能需要进行多个次去重才能够得到一个最终的结果,然后就有小伙伴不淡定了,因为我们的参照列是一列,只有姓名列,如果想要两列或者多列同时去重呢?
场景简介
还是上节的案例,多列去重,我们假设我们需要满足的条件是,姓名+班级这两列数据完全相同,才算是同一个数据源,只有有一个不同就不算是相同数据,比方说A15,姓名和班级都是相同的, 我们保留一个就可以了。
第三个表中,虽然C22有两个,但是班级不同,是不同班级的相同姓名的童鞋(名字比较大众化~~哈哈),这样的话,我们可能是当成不同的两个人
那么在这样的情况如何实现呢?
代码区
Sub TEST()
Dim sth As Worksheet, rng As Range, zd As Object, a As Range, arr, arr1()
Set rng = Application.InputBox("请选择参照列", "参照列的选择", , , , , , 8)
Set zd = CreateObject("scripting.dictionary")
colnum = rng.Column
colnums = rng.Columns.Count
k = 0
For Each sth In Worksheets
sth.Activate
rl = sth.Cells(Rows.Count, 1).End(xlUp).Row
cl = sth.Cells(1, Columns.Count).End(xlToLeft).Column
arr = sth.Range(Cells(1, colnum), Cells(rl, cl))
For i = 1 To UBound(arr)
s = arr(i, 1) & "-" & arr(i, 2)'想要多列的话,就改这里
If Not zd.Exists(s) Then
k = k + 1
zd(s) = k
ReDim Preserve arr1(1 To cl, 1 To k)
For i1 = 1 To cl
arr1(i1, k) = arr(i, i1)
Next i1
End If
Next i
Next sth
Worksheets.Add
ActiveSheet.Name = "去重版名单"
ActiveSheet.Cells(1, 1).Resize(k, UBound(arr1)) = WorksheetFunction.Transpose(arr1)
End Sub
好像代码并没有太大的变化,来看看效果
首先依然是选择参照列,这里的参照列我们是选择两列
然后就可以去喝口茶了。
看结果
出来了,我们来验证下上面几个人员的情况
A15 只保留了一个,符合我们的要求,因为他的姓名和班级是相同的
C22保留了两个数据,因为虽然姓名相同,但是班级不同,在本案例中是不同的人
完美
代码分析
虽然今天的代码看起来比较的简单,和上节的情况似乎差不多,其实思路也是一样的,利用字典的唯一性,但是逻辑上要稍微费点脑细胞理解下
我们从进入每个工作表的循环开始说起
rl = sth.Cells(Rows.Count, 1).End(xlUp).Row
cl = sth.Cells(1, Columns.Count).End(xlToLeft).Column
arr = sth.Range(Cells(1, colnum), Cells(rl, cl))
现货区当前工作表的区域,然后将它赋值给数组arr,这里我们为什么不直接用usedrange呢?因为我们后面会使用到rl,cl这两个变量、
然后进入今天的重点(划重点了)
既然我们这里要进行多列去重,那么就等于将多列作为一个整体,将这多列数据当成一列,因为我们这里是两列,我们就将这两列的内容合起来复制给一个变量s
s = arr(i, 1) & "-" & arr(i, 2)
我们运行下看看是什么效果
看图大家应该能够看出来了,就是讲第一列和第二列通过连接符“-”联系在一起,作为一个整体,我们通过判断这个整体在字段中是否存在作为参考标准。
如果存在跳过,如果不存在,就利用数组将所有的数据装进数组中
本案例我们将所有的数据都汇总起来,这里就是利用动态数据的方式来进行了。 因为已经确定了列数,cl,所以动态数组就很好处理了。
ReDim Preserve arr1(1 To cl, 1 To k)
因为数据比较多,我们不可能和之前一样一个个去赋值,这样不科学,也不规范,这里我们再利用循环的方式将数组赋值
For i1 = 1 To cl
arr1(i1, k) = arr(i, i1)
Next i1
看看效果图
其实就是通过循环的方式将每个数据放到数组中了,避免了之前一个一个写的烦恼
看看重复数据,A15,这里我们已经来到第二个表了,A15这个位置,这时候的S=“A15-高三1班”,字典中也存在这个值了,所以是直接跳过的
第一次弄这种动画,不知道效果如何
而C22,因为班级不同,所以s并不同,故依然还是会进行如数组的循环,不断的装数据
怎么样,这样分步讲解,大家是否能够理解呢?
VBA中两大得力助手,字典和数组都在本节出现了,快来一起学习吧
好了~明晚21:00,准时再见。