Excel VBA 7.28一边去重复项一边合并数据一边聊着天,这样的上班节奏你想要吗?
合并工作表数据一直都是我们日常工作中最常见的工作内容了,但是还是那句话,数据源总是千奇百怪的,数据也存在一定的差异,甚至还会有重复数据的情况,这些重复数据,在进行汇总计算的过程中是最头疼的,因为他们将会影响我们的最终结算结果,给我们对实际情况的判断来带一定的影响,那么在进行数据合并的过程中,我们能够将这些重复数据进行剔除呢?
场景简介
是这样的要求并不算是很好,在我们日常工作中此类场景是经常出现的,很多的小伙伴们都是选择先通过筛选重复项,删掉重复数据之后在进行合并计算的
但是此方法有一个为,那就是没有办法跨工作表进行去重,那么意味着我们在每个工作表去重之后,还需要针对最后的结果在进行一次去重,非常的麻烦,那么我们用VBA操作了那么多的数据合并,在进行数据合并的时候,是否能够判断重复项,并且删除呢?
代码区
假设我们手上有三分摸底考试的成绩汇总,在统计数据的时候,老师不小心将A15的数据同步统计到了第二个表上了,而A6的数据同步也统计到了第三个表上面, 而且因为操作的失误,将C22的数据统计了两次,那么我们在汇总最终参加考试人员的时候,就尝试着将这些情况避免掉
对我们之前讲述的内容有印象的小伙伴应该还记得我之前说过,字典在vba中是有唯一性的,所以我们经常用字典来进行去重,那今天我们就用字典了。
我们来看看代码
Sub TEST()
Dim sth As Worksheet, rng As Range, zd As Object, aarr, a As Range
Set rng = Application.InputBox("请选择参照列", "参照列的选择", , , , , , 8)
Set zd = CreateObject("scripting.dictionary")
colnum = rng.Column
For Each sth In Worksheets
sth.Activate
l = sth.Cells(Rows.Count, 1).End(xlUp).Row
Set trng = sth.Range(Cells(2, 1), Cells(l, 1))
For Each a In trng
a.Select
k = a.Value
If Not zd.Exists(k) Then
zd.Add k, a.Offset(0, 1)
End If
Next a
Next sth
arrid = zd.keys()
arrclass = zd.items()
num = zd.Count()
Worksheets.Add
ActiveSheet.Name = "去重版名单"
ActiveSheet.Range(Cells(1, 1), Cells(num, 1)) = WorksheetFunction.Transpose(arrid)
ActiveSheet.Range(Cells(1, 2), Cells(num, 2)) = WorksheetFunction.Transpose(arrclass)
End Sub
看看效果,程序开始之后,会让我们选择一个参照列,为什么要选择参照列呢?
如果没有参照列的话,怎么知道你要判断的是那一列的数据是否重复呢?总不能用姓名和成绩之间去重吧,所以我们要先选择一个参照列,这里我们要统计的人人员名单,所以只需要选择姓名列即可。
然后程序就可以顺利的执行了,看看最终的效果
。
数据全部汇总过来了,我们看下我们前面重复的数据,以C22举例,因为他是在同一个工作表内重复的
只有一个
然后我们在看看跨工作表重复的数据,A6
也只有一个,非常完美
代码分析
今天就一个操作,字典,所以我们来重点说下字典的用法
Set zd = CreateObject("scripting.dictionary")
首先声明一个字典
字典有一个特性,就是唯一性,所以我们在循环遍历所有的表的姓名那一列的时候,就只需要判断当前姓名是否在字典中即可,如果判断字典中是否存在这个姓名呢?
If Not zd.Exists(k) Then
看字面意思都能够想到了,如果不存在的话,就怎么样呢?
zd.Add k, a.Offset(0, 1)
往字典中增加一个键值对,键就是姓名,值就是班级。
一次循环,我们来看看循环到第二个表A15的时候,代码是怎么操作的。
这个时候的k正好就是A15这个名字,同时通过立即窗口我们也得到了了当前字典中A15已经有了对应的值,高三一班了,所以按照逻辑,这里应该是跳过if判断的
事实证明代码也是正好跳过了判断
当我们全部遍历完成一遍之后,就需要将字段输出了,字典分为两部分,一部分就是姓名,是字典的键,另外一部分就是字典的值,那么如果区分出来呢?
arrid = zd.keys()'键
arrclass = zd.items()'值
这两个分别是一个数据,我们通过数组一次性写入的方式,写入 新建的工作薄中,就可以得到我们想要的最终结果了。