送人玫瑰,手有余香,请将文章分享给更多朋友
动手操作是熟练掌握EXCEL的最快捷途径!
【置顶公众号】或者【设为星标】及时接收更新不迷路
朋友们好,今天继续来和大家分享VBA方面的知识和技巧。今天的这道题目也仍有一定的代表性。
我们以前分享过如何找到两列中相同的数据,即重复值。在那一篇帖子中也提到了如何提取两列中不重复的数据。当时我们使用的是多维引用公式法。而今天这篇帖子中将着重分享一下在VBA中如何用数组和字典的方法来解决这个问题。
题目是这样子的:
上图中涂黄色的单元格都是不重复的数据,C列中是模拟的结果。
数组法
数组法的基本思路是:把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行代码:最后数据输出
实际上这段代码还是有些繁琐和复杂了。如果使用字典,代码将非常清晰和简单。
字典方法
字典方法的主要思路是:首先将一列数据(比如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操作问题时不再迷茫无助
我就知道你“在看”
联系客服