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)

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

(0)

相关推荐