VBA调用外部对象01:字典Dictionary(去除重复数据)

2020-07-28 10:54:43 浏览数 (1)

前面我们简单介绍了字典的方法、属性,以及使用字典来快速判断数据是否存在。

如果你的数据是有重复的,前面那个例子里的代码将会出错:

代码语言:javascript复制
For i = 2 To rowA
    d.Add arrA(i, 1), i
Next

字典的这种添加Key和Item的方式是不允许重复的:

这个错误将会中断我们的程序运行,那如何避免这种错误的出现呢?

既然字典有Exists方法可以判断是否存在,那在Add之前我们先进行一次判断就可以了:

代码语言:javascript复制
        If Not d.Exists(arrA(i, 1)) Then
            d.Add arrA(i, 1), i
        End If

但是这样需要3条语句,实在有点麻烦,你应该还记得前面我们讲到的那个缺省的Item属性,那我们换一个思路,属性如果不是只读的,我们是可以去更新它的:

代码语言:javascript复制
d.Item(arrA(i, 1)) = i

这样一条语句的意思就是我要更新Key为arrA(i, 1)这个值的Item属性,而且字典在处理这个的时候,如果是不存在的Key,它是会自动调用Add方法增加的,这样我们就解决了因为重复Key而导致的错误提示了,又因为Item是缺省属性,所以是可以省略的,简化后的代码就是:

代码语言:javascript复制
d(arrA(i, 1)) = i

这样就更方便了,如果你看了前面我提到的那个帖子“呼之即来,挥之即去”,应该已经知道了这种方法,VBA中使用字典基本是不会明确调用Add方法的,一般情况都是用这种直接更新Item的方式。

去除重复:

我们知道了字典的这个特点,不允许重复的Key,那我们就可以使用它来完成一个经常会碰到的去除重复数据的功能了,我们只需要把数据全部添加到字典中,最后取出Keys就可以了,非常的简单:

代码语言:javascript复制
Sub TestDic2()
    '声明
    Dim d As Dictionary
    '创建
    Set d = New Dictionary
    
    Dim arrA() As Variant
    
    Dim rowA As Long
    Dim i As Long
    
    '获取A列的最后一行行号
    rowA = Cells(Cells.Rows.Count, 1).End(xlUp).Row
    
    '将A列的数据存放到数组中
    arrA = Range("A1").Resize(rowA, 1).Value
    
    '将A列数据记录到字典中
    For i = 2 To rowA
        d(arrA(i, 1)) = i
    Next
    
    '输出结果
    Range("B1").Resize(d.Count, 1).Value = Application.WorksheetFunction.Transpose(d.keys)
    
    '释放
    Set d = Nothing
End Sub

0 人点赞