Excel VBA 8.6单列唯一值不过瘾?升级下!用字典获取多列唯一值
前景提要
之前我们再分享获取唯一值的时候,也是介绍了几种不同的方法来实现效果,昨天我们介绍了字典的方式,今天我们还是介绍字典,不同的是,我们处理的对象不再是单列,而是多列,毕竟有时候我们需要获取多列的唯一值。
场景说明

这是我们今天的数据源,我们希望根据性名列和班级列来进行去重,得到姓名+班级这样的一个唯一值所组成的序列,之前我们已经有介绍过其他方法的,我们这里来分享下用字典如何来实现效果。
代码区
Sub test()
Dim rng As Range, arr, zd As Object, arr1()
Set zd = CreateObject("scripting.dictionary")
Set rng = Application.InputBox("请选择数据区", "数据区", , , , , , 8)
arr = rng
k = 0
For i = 1 To UBound(arr)
s = arr(i, 1) & "-" & arr(i, 2)
If Not zd.Exists(s) Then
zd.Add s, 1
k = k + 1
ReDim Preserve arr1(1 To 2, 1 To k)
arr1(1, k) = arr(i, 1)
arr1(2, k) = arr(i, 2)
End If
Next i
Range("E2").Resize(k, 2) = WorksheetFunction.Transpose(arr1)
End Sub
其实代码也是很简单的,如果大家对之前的文章有印象的话,那么应该对这个方法是很熟悉的。
这里先来确认下效果。

从结果上来看,我们很轻松的的获得了唯一值的效果,虽然性名列都是A1,但是班级是不相同的,所以结果还是正确的。
代码解析
一起来分析下今天的代码
这里我们不单单是用字典,而且还用到了数组的方式,
Set zd = CreateObject("scripting.dictionary")
就像我们之前所说的那样,字典并不能够直接使用,至少需要做一个声明
Set rng = Application.InputBox("请选择数据区", "数据区", , , , , , 8)
利用输入框窗体行程的交互界面,灵活的获取实际的使用区域
arr = rng
并把最终的数据源赋值给数组arr,这样可以更好的提升代码的运行速度。

有了数组之后,我们就可以在数组内部进行循环了,再循环的过程中,我们这里依然是利用字典的唯一性,不过因为我们是多列操作,所以,等于是要将多列看做是一个整体。在代码中我们可以选择将这几个变量合并在一起,当成一个整体来操作
s = arr(i, 1) & "-" & arr(i, 2)

判断字典中是否存在一个组合,什么组合呢?就是前面我们构造的这个“姓名”-“班级”的组合,如果存在就忽略跳过,判断下一个单元格,如果不存在,那就可以往字典中添加数据了
zd.Add s, 1
但是添加一个组合去字典中并不是我们最终的目的,我们的最终目的是要形成一个姓名列,一个班级列的这样的唯一值的判断,这里我们就借助数组的形式了。
如果往字典中增加了新的数据,那么我们就同步的往数组中也添加数据,添加什么数据呢?
对应的性名列和班级列得内容
k = k + 1
ReDim Preserve arr1(1 To 2, 1 To k)
arr1(1, k) = arr(i, 1)
arr1(2, k) = arr(i, 2)

最终就得到了我们想要的效果了。