利用字典,将只出现一次的数据提取出来

2023-06-30 浏览次数 75

大家好,今日我们继续讲解VBA数组与字典解决方案,今日讲解第61讲内容:利用字典,将只出现一次的数据提取出来.

字典可以应用于有很多的实际工作场景,可以利用的方法也很多.最为基本的要注意理解键和键值的概念,注意理解Keys 和items 本身就是数组,是一个一维数组,这非常关键。可能在概念讲解的时候大家很清晰,但是实战中就会有所迷茫,所以我在各种实际场景的模拟中尽可能的会结合常见理解中一些误区给大家深入分析。

今日实例,在下面的数据表中,有一系列的数据,我要快速的提取出只出现一次的数据,如何做到?

思路分析:上述A列数据中有很多是重复的,排重最简单的是字典,所以我们要用字典来解决。给字典赋值后,同时求出每个数值出现次数。然后在字典中建立一个循环,如果出现次数是多于1的那么移除这个键。最后根据更新后的字典回填数据。下面看我给出的代码:

Sub mynzsz_61() '第61讲 利用字典,将只出现一次的数据提取出来

Sheets("61").Select

'将数据放到数组中

myarr = Range([a1], [a65536].End(3))

Set mydic = CreateObject("Scripting.Dictionary")

'将数据放到字典中,并统计每个数据出现的次数

For i = 1 To UBound(myarr)

mydic(myarr(i, 1)) = mydic(myarr(i, 1)) + 1

Next

'将重复出现的数据移除

For i = mydic.Count To 1 Step -1

If Application.WorksheetFunction.Index(mydic.items, i) > 1 Then

mydic.Remove Application.WorksheetFunction.Index(mydic.keys, i)

End If

Next

'将更新后的字典数据回填

[e:e].Clear

[E1] = "不重复数据"

Sheets("61").[E2].Resize(mydic.Count) = WorksheetFunction.Transpose(mydic.keys)

Set mydic = Nothing

End Sub

代码截图:

代码讲解:

1 上述过程实现了:将上述数据赋值给字典mydic,在赋值同时用键来装载数据,用键值来装载出现数值次数。然后在字典mydic中建立一个循环,如果出现次数是多于1的那么移除这个键。这里要千万注意,一定是从后向前进行移除。

2 '将数据放到数组中

myarr = Range([a1], [a65536].End(3))

上述语句将数据放到数组中。

4 '将数据放到字典中,并统计每个数据出现的次数

For i = 1 To UBound(myarr)

mydic(myarr(i, 1)) = mydic(myarr(i, 1)) + 1

Next

上述语句将数据放到字典中,注意mydic(myarr(i, 1)) = mydic(myarr(i, 1)) + 1是将键值作为计数处理。

5 '将重复出现的数据移除

For i = mydic.Count To 1 Step -1

If Application.WorksheetFunction.Index(mydic.items, i) > 1 Then

mydic.Remove Application.WorksheetFunction.Index(mydic.keys, i)

End If

Next

上述语句是实现移除工作。移除的是键。所以要在键的一维数组中找到对应的值,一位数组是横向排列的,所以要利用Index()函数提取相应的列。

6 Sheets("61").[E2].Resize(mydic.Count) = WorksheetFunction.Transpose(mydic.keys)

上述语句是实现更新后字典数据回填工作,这种处理没有动字典的结构,所以可以直接提取键,回填。

下面我们看代码的运行结果:

今日内容回向:

1 keys 和items 有对应关系吗?

2 上述的移除工作为什么要从后向前进行呢?