打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Excel VBA 7.28一边去重复项一边合并数据一边聊着天,这样的上班节奏你想要吗?

合并工作表数据一直都是我们日常工作中最常见的工作内容了,但是还是那句话,数据源总是千奇百怪的,数据也存在一定的差异,甚至还会有重复数据的情况,这些重复数据,在进行汇总计算的过程中是最头疼的,因为他们将会影响我们的最终结算结果,给我们对实际情况的判断来带一定的影响,那么在进行数据合并的过程中,我们能够将这些重复数据进行剔除呢?

场景简介

是这样的要求并不算是很好,在我们日常工作中此类场景是经常出现的,很多的小伙伴们都是选择先通过筛选重复项,删掉重复数据之后在进行合并计算的

但是此方法有一个为,那就是没有办法跨工作表进行去重,那么意味着我们在每个工作表去重之后,还需要针对最后的结果在进行一次去重,非常的麻烦,那么我们用VBA操作了那么多的数据合并,在进行数据合并的时候,是否能够判断重复项,并且删除呢?

代码区

假设我们手上有三分摸底考试的成绩汇总,在统计数据的时候,老师不小心将A15的数据同步统计到了第二个表上了,而A6的数据同步也统计到了第三个表上面, 而且因为操作的失误,将C22的数据统计了两次,那么我们在汇总最终参加考试人员的时候,就尝试着将这些情况避免掉

对我们之前讲述的内容有印象的小伙伴应该还记得我之前说过,字典在vba中是有唯一性的,所以我们经常用字典来进行去重,那今天我们就用字典了。 

我们来看看代码

Sub TEST()Dim sth As Worksheet, rng As Range, zd As Object, aarr, a As RangeSet rng = Application.InputBox("请选择参照列", "参照列的选择", , , , , , 8)Set zd = CreateObject("scripting.dictionary")colnum = rng.ColumnFor 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 aNext stharrid = zd.keys()arrclass = zd.items()num = zd.Count()Worksheets.AddActiveSheet.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()'值

这两个分别是一个数据,我们通过数组一次性写入的方式,写入 新建的工作薄中,就可以得到我们想要的最终结果了。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
活用数组 字典的组合,轻松实现Excel自身没有的功能
完全手册Excel VBA典型实例大全:通过368个例子掌握
Excel VBA 7.15 Excel表格合并之指定列合并 合并数据更精确
多工作表筛选符合要求数据,你是手动党?这大概是你加班的原因
自定义函数,系统函数,数组,字典,事件(VBA)(下)
VBA抓取股票历史数据的整体表处理
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服