打开APP
userphoto
未登录

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

开通VIP
VBA去重再合并数据,学会字典后可以更优雅地写代码了!


送人玫瑰,手有余香,请将文章分享给更多朋友

动手操作是熟练掌握EXCEL的最快捷途径!

【置顶公众号】或者【设为星标】及时接收更新不迷路



朋友们好,今天继续来和大家分享VBA方面的知识和技巧。今天的这道题目也仍有一定的代表性。

我们以前分享过如何找到两列中相同的数据,即重复值。在那一篇帖子中也提到了如何提取两列中不重复的数据。当时我们使用的是多维引用公式法。而今天这篇帖子中将着重分享一下在VBA中如何用数组和字典的方法来解决这个问题。

题目是这样子的:



上图中涂黄色的单元格都是不重复的数据,C列中是模拟的结果。


01

数组法



数组法的基本思路是:把A列对B列不重复的数据提取出来并装入数组;再把B列相对于A列不重复的数据取出来并装入数组,最后再将这两个数组合并为一个数组即可。

完整的代码如下:

Sub 去除两列中的重复值并重排()    Dim varArr1 As Variant, varArr2 As Variant, temvarArr1(), temvarArr2(), tem(), tem1, tem2    varArr1 = Range("A1:A" & Range("A1").End(xlDown).Row)    varArr2 = Range("B1:B" & Range("B1").End(xlDown).Row)    ReDim temvarArr1(1 To UBound(varArr1))    For i = 1 To UBound(varArr1)        temvarArr1(i) = varArr1(i, 1)    Next    ReDim temvarArr2(1 To UBound(varArr2))    For i = 1 To UBound(varArr2)        temvarArr2(i) = varArr2(i, 1)    Next    tem1 = Filter(temvarArr1, temvarArr2(1), False)    For i = 2 To UBound(temvarArr2)        tem1 = Filter(tem1, temvarArr2(i), False)    Next    tem2 = Filter(temvarArr2, temvarArr1(1), False)    For i = 2 To UBound(temvarArr1)        tem2 = Filter(tem2, temvarArr1(i), False)    Next    ReDim tem(0 To UBound(tem1) + UBound(tem2) + 1)    For i = 0 To UBound(tem1)        tem(i) = tem1(i)    Next    For i = UBound(tem1) + 1 To UBound(tem1) + UBound(tem2) + 1        tem(i) = tem2(i - UBound(tem1) - 1)    Next    Range("C1") = "两列数中去掉相互重复值后合并"    [C2].Resize(UBound(tem) + 1, 1) = Application.WorksheetFunction.Transpose(tem)End Sub

第5-12行代码:分别将A、B两列的数据装入到数组中

第13-16行代码:将A列对B列没有重复的数据装入数组中。这里使用了FILTER函数,其第二参数是FALSE,含义是提取并返回不包含查找值的数据

第17-20行代码:同样的操作

第21-27行代码:将上面这两个数组装入到数组tem中

第28-29行代码:最后数据输出

实际上这段代码还是有些繁琐和复杂了。如果使用字典,代码将非常清晰和简单。


02

字典方法



字典方法的主要思路是:首先将一列数据(比如A列)装入字典,键值赋值空。接下来将另一列也装入字典。如果字典中已经存在相同的键值,则赋值为“1”,字典中不存在的则赋值空。最后将键值为“1”的全部删除即可。

完整的代码如下:

Sub 合并()    Dim myarr As Variant, mybrr As Variant, mydic As Object, i As Integer, d    myarr = Range("A1:A" & Range("A1").End(xlDown).Row)    mybrr = Range("B1:B" & Range("B1").End(xlDown).Row)    Set mydic = CreateObject("scripting.dictionary")    For i = 1 To UBound(myarr)        mydic(myarr(i, 1)) = ""    Next i    For i = 1 To UBound(mybrr)        If mydic.exists(mybrr(i, 1)) Then            mydic(mybrr(i, 1)) = 1        Else            mydic(mybrr(i, 1)) = ""        End If    Next i    For Each d In mydic.keys        If mydic(d) = 1 Then mydic.Remove (d)    Next    Range("C1") = "两列数中去掉相互重复值后合并"    [C2].Resize(mydic.Count, 1) = Application.Transpose(mydic.keys)End Sub

这段代码非常清晰简单,极大地降低了解题的难度和复杂程度。

本期内容练习文件提取方式:

链接:https://pan.baidu.com/s/1h5GVwGB2xcmmR2AzB189Zw?pwd=t1so

提取码:t1so


好了朋友们,今天和大家分享的内容就是这些了!喜欢我的文章请分享、转发、点赞和收藏吧!如有任何问题可以随时私信我哦!

-END-

长按下方二维码关注EXCEL应用之家

面对EXCEL操作问题时不再迷茫无助

我就知道你“在看”

推荐阅读
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
利用数组作为字典键值,实现数据快速排重及快速回填
利用数组和字典,实现两级下拉菜单的录入方式
字符数组清空
Excel VBA小程序
VBA代码实现多字段排序
三级下拉菜单的制作过程
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服