玩转Excel-用vba查询多个工作表中数据有无重复值出现
在vba中,有两种字典结构,一种是VBA内置的字典对象,另一种是Scripting.Dictionary。这两种字典结构都是可以用来存储键值对。
相比于内置VBA字典对象,Scripting.Dictionary具有更加强大的功能,主要体现在:
1.功能更丰富,Scripting.Dictionary提供了丰富的属性和方法,能对字典对象实现更方便的操作。
2.Scripting.Dictionary具有更快的访问速度。
3.Scripting.Dictionary具有更多的键和值的容量。内置的VBA字典对象只能存储65536个键值对,而Scripting.Dictionary对象没有这个限制,可以存储更多的键值对。
今天,我们将通过一个案例对Scripting.Dictionary进行深入理解。
假如现有一个工作簿,其中有10张工作表,每个工作表的A列有若干人名,请问怎么快速找出这10张工作表的全部人名中有无重复出现的?
解决思路:
1.循环遍历每张工作表的A列有数据的单元格区域;
2.在当前工作表内,设置一个Scripting.Dictionary对象;
3.循环遍历A列全部有人名的单元格,如果当前单元格的值不在字典对象的“键”中,那么在字典对象中添加人名作为“键”,“值”设定为0;
4.如果当前单元格的值存在于字典对象的“键”中,那么c增加1,用c=c+1实现计数器功能;
5.当前工作表遍历完成后,如果c>0,说明存在重复值,否则不存在重复值。
解决方案:
Sub CheckDuplicatesInAllSheets()
Dim ws As Worksheet
For Each ws In ThisWorkbook.Sheets '循环遍历工作簿中的所有工作表
Call CheckDuplicatesInSheet(ws) '在当前工作表中调用子程序CheckDuplicatesInSheet
Next ws
End Sub
--------------------------------------------------------------------------------------------
Sub CheckDuplicatesInSheet(ws As Worksheet)
Dim rng As Range
Dim cell As Range
Dim d As Object
Dim c As Long
Set rng = ws.Range("A1", ws.Range("A1").End(xlDown)) '选定当前工作表的A1到A列最后一个人名区域,赋值给rng变量
Set d = CreateObject("Scripting.Dictionary") '创建一个Scripting.Dictionary对象d
For Each cell In rng '遍历rng这个区域内的每个单元格
If Not d.Exists(cell.Value) Then '如果d中不存在当前单元格的值
d.Add cell.Value, 0 '给d增加键值对,当前单元格的值为“键”,“值”为0
Else '如果d中存在当前单元格的值
c = c + 1 '计数器加1
End If
Next cell