添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
玩转Excel-用vba查询多个工作表中数据有无重复值出现

玩转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