EXCEL——VBA字典实现查找多列的重复项

作者: tobbyvic | 来源:发表于2018-03-20 20:36 被阅读20次
    animal-3239706_640.jpg

    顾得猫宁,各位亲爱的读者。今天我们来讲一讲VBA编程中一个重要的知识点——字典。为了更好的让大家理解字典是什么意思,我整理了网上一位大牛总结的字典相关知识,特此给大家转载过来,希望大家有所收获。

    • 字典相关知识解析(通俗易懂,更是精华)
    1. 定义字典
      Set d = CreateObject("Scripting.Dictionary")

    2. 呼之即来,挥之即去

    d("张三“)=1 '相当于给字典赋值,张三过来(没有就生成)拿个1站一边去
    d("李四”)=2 '相当于给字典赋值,李四过来(没有就生成)拿个2站一边去
    d("李四”)=3 '相当于改变值,字典中已经有李四了,李四跑过来,丢下2换个3站一边去
    注:这时字典中有两个人的存在,张三=1 和 李四=3,相当于实现了去重复的功能

    s=d("张三") 's=1 即叫了声张三,张三就告诉你他拿的是1
    s=d("李四") 's=3 即叫了声李四,李四就告诉你他拿的是3
    s=d("麻子") 's="" 没有找到麻子怎么办呢,字典里就自动生成一个麻子d("麻子") =“”,告诉你他手上是空的
    注:这时字典中有三个人的存在,张三=1 ; 李四=3;麻子=“”

    1. 将字典里的东西变成数组

    arr= d.Keys '把名字的集合按先来后到的原则放到一维数组里 arr(0)=“张三” ; arr(1)=“李四” ; arr(2)=“麻子”
    arr1=d.Items '把名字对应的值的集合按先来后到的原则放到一维数组里 arr1(0)=“1” ; arr1(1)=“3” ; arr1(2)=“”

    1. 查找字典中有没有这个人
      s=d.Exists(“张三”) 's=True 有的
      s=d.Exists(“彭希遴”) 's=False 没有

    2. 清空数组
      d.RemoveAll

    注:上文出处为http://club.excelhome.net/thread-926188-1-1.html本文只做学习转载使用,如侵必删,有异议请联系作者

    • 下面我们找个具体的例子来运用一下
      比如下面两列数据,我们要通过VBA代码来实现将两列都重复的行高亮出来。这个时候应该怎么办呢?


      image.png

      我们通过字典就可以实现解决这个问题,下面我们看一下代码:

    Sub 双列查找重复项()
        arr = [a1].CurrentRegion
        Set d = CreateObject("scripting.dictionary")
        Application.ScreenUpdating = False
        For j = 2 To UBound(arr)
            d(arr(j, 1) & arr(j, 2)) = 1 + d(arr(j, 1) & arr(j, 2))
        Next
        For j = 2 To UBound(arr)
            If (d(arr(j, 1) & arr(j, 2))) > 1 Then
                Cells(j, 1).Resize(1, 2).Interior.ColorIndex = 3
            End If
        Next
        Application.ScreenUpdating = True
    End Sub
    

    在上面的代码中,首先,我们创建了一个字典
    Set d = CreateObject("scripting.dictionary")
    然后Application.ScreenUpdating = False是为了让代码运行更快速。
    下面这一行是对字典中进行赋值,当没有重复值的时候,赋值都为1,而当有重复值的时候,值就会大于1

    For j = 2 To UBound(arr)
            d(arr(j, 1) & arr(j, 2)) = 1 + d(arr(j, 1) & arr(j, 2))
    Next
    

    最后,再次对字典的值进行遍历并条件判断,即可判断哪些是重复的值,其对应的行的单元格高亮即可

    For j = 2 To UBound(arr)
            If (d(arr(j, 1) & arr(j, 2))) > 1 Then
                Cells(j, 1).Resize(1, 2).Interior.ColorIndex = 3
            End If
    Next
    

    最后得到的结果如下:


    3月-20-2018 20-20-36.gif

    希望能帮到大家~

    ~如果对本文有疑问,请联系作者哦 animal-3239706_640.jpg
    ~

    相关文章

      网友评论

        本文标题:EXCEL——VBA字典实现查找多列的重复项

        本文链接:https://www.haomeiwen.com/subject/qjxiqftx.html