使用字典快速获取唯一值与重复值【单个字典对象】

77 篇文章 6 订阅
16 篇文章 3 订阅

在以前的博客《使用字典快速获取唯一值与重复值(交集与并集)》使用多个字典对象获取交集与并集,最近有同学提问,是否可以只使用一个字典对象实现相同的功能,对于有“编程洁癖”的同学来说,可能不喜欢使用多个字典对象。

实例需求:表1和表2为两个名单,不同班级有同名的学生,例如表2中有两个小王(截图中黄色单元格),因此需要使用班级+姓名作为学生的唯一识别标识,现在需要统计如下三个清单

  • 表1有表2无
  • 表1无表2有
  • 两表共有

在这里插入图片描述

示例代码如下。

Sub demo()
    Set objDic = CreateObject("scripting.dictionary")
    arr = ActiveSheet.Range("a2").CurrentRegion
    For i = 3 To UBound(arr)
        sKey = arr(i, 2) & "|" & arr(i, 3)
        objDic(sKey) = 1
    Next
    brr = ActiveSheet.Range("e2").CurrentRegion
    For i = 3 To UBound(brr)
        sKey = brr(i, 2) & "|" & brr(i, 3) 
        If objDic.Exists(sKey) Then 
            objDic(sKey) = 3
        Else
            objDic(sKey) = 2
        End If
    Next
    range("I3:P31").clearcontents
    iRow = 3: lRow = 3: oRow = 3
    For Each strKey In objDic.Keys
        If objDic(strKey) = 1 Then
            ActiveSheet.Cells(iRow, "I").Resize(, 2) = Split(strKey, "|")
            iRow = iRow + 1
        ElseIf objDic(strKey) = 2 Then
            ActiveSheet.Cells(lRow, "L").Resize(, 2) = Split(strKey, "|")
            lRow = lRow + 1
        ElseIf objDic(strKey) = 3 Then
            ActiveSheet.Cells(oRow, "O").Resize(, 2) = Split(strKey, "|")
            oRow = oRow + 1
        End If
    Next
    Set objDic = Nothing
End Sub

【代码解析】
第1行代码创建字典对象。
第3行代码将表1读取到数组中。
第4~7行代码循环遍历表1中的数据。
第5行代码将班级和姓名组合作为字典对象的键,其中使用竖线作为分隔符,以便于回写数据时进行拆分。
第6行代码将键加入到字典中,其值设置为1。
第8~16行处理表2的数据,主要结构同上。
第11行代码判断键是否存在于字典中。

  • 如果存在,说明是两表共用的数据,第12行代码将值修改为3。
  • 如果不存在,说明是表2独有的数据,第14行代码将值修改为2。

至此,将全部数据加载到字典对象中,根据键值(1,2,3)可以区分该学生属于哪个清单。
第17行代码清空结构单元格区域。
第18行代码设置3个清单的起始行为第3行。
第19~30行代码循环遍历字典对象中的键。
第20~29行代码根据键值,分别写入I、L或者O列相应的单元格中。
其中,resize(, 2)将单元格区域扩展至一行两列,即两个单元格。
Split函数将拆分班级和姓名,用于写入单元格区域。
第30行代码释放对象变量所占用的系统资源。


字典对象很灵活,充分利用其特性可以实现很多功能,希望本文对于各位同学有帮助。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值