使用字典快速获取唯一值与重复值(交集与并集)

本文介绍如何利用VBA中的字典对象进行数据处理,包括求取数据的交集、并集、唯一值及重复值。通过具体示例代码,展示如何在Excel中实现数据的高效管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据处理工程中经常用到去重和取唯一值,或者取几组数据的交集与并集,其实这两类问题的求解思路是相同的。字典对象中的元素具备唯一性,因此经常被用来处理此类问题。
假设有如下数据集合,对于B列和C列数据需要求取交集和并集等数据集合。

示例代码如下:

'Option Explicit

Sub LoadData()
    Dim aData, aRes, lst, iRow, iCol, iKeyCol
    Dim bDic, cDic, bcDic, bNotcDic, cNotbDic, allDic
    Const COLUMNS_QTY = 3
    With ActiveSheet
        iKeyCol = 1
        lst = .Cells(.Rows.Count, iKeyCol).End(xlUp).Row
        aData = .Cells(1, iKeyCol).Resize(lst, COLUMNS_QTY).Value
        Set bDic = CreateObject("Scripting.Dictionary")
        Set cDic = CreateObject("Scripting.Dictionary")
        Set bcDic = CreateObject("Scripting.Dictionary")
        Set bNotcDic = CreateObject("Scripting.Dictionary")
        Set cNotbDic = CreateObject("Scripting.Dictionary")
        Set allDic = CreateObject("Scripting.Dictionary")
        For iRow = 1 To UBound(aData, 1)
            keyb = aData(iRow, 2)
            If Not bDic.exists(keyb) Then bDic(keyb) = keyb
            keyc = aData(iRow, 3)
            If Not cDic.exists(keyc) Then cDic(keyc) = keyc
        Next iRow
        For Each b In bDic.keys
            If cDic.exists(b) Then
                bcDic(b) = b
            Else
                bNotcDic(b) = b
            End If
            allDic(b) = b
        Next b
        For Each c In cDic.keys
            If Not bDic.exists(c) Then
                cNotbDic(c) = c
                allDic(c) = c
            End If
        Next c
        Range("E:H").Clear
        Range("E1:H1").Value = Array("B和C公有", "B独有", "C独有", "B和C并集")
        Range("E2").Resize(bcDic.Count, 1).Value = Application.Transpose(bcDic.items())
        Range("F2").Resize(bNotcDic.Count, 1).Value = Application.Transpose(bNotcDic.items())
        Range("G2").Resize(cNotbDic.Count, 1).Value = Application.Transpose(cNotbDic.items())
        Range("H2").Resize(allDic.Count, 1).Value = Application.Transpose(allDic.items())
    End With
    Set bDic = Nothing
    Set cDic = Nothing
    Set bcDic = Nothing
    Set bNotcDic = Nothing
    Set cNotbDic = Nothing
    Set allDic = Nothing
End Sub

【代码解析】
第8行代码指定用于定位最后数据行的数据列,示例代码中使用A列。
第9行代码使用End(xlUp)定位最后一行数据所在行。
第10行代码将数据加载到数组中,便于后续处理。
第11行到第16行代码创建6个字典对象。

变量名称用途
bDicB列数据唯一值
cDicC列数据唯一值
bcDicB列和C列公用有数据,即交集
bNotcDicB列不存在于C列中的数据
cNotbDicC列不存在于B列中的数据
allDicB列和C列数据的合集,即并集

第24行代码和第32行代码使用字典对象的exists属性判断指定关键字是否已经存在于字典的KEYS中。
第23行到26行代码通过循环判断,获取四个字典对象。
第38行代码写入结果标题行。
第39行到第42行代码分别将数据写入指定列。
第44行到第49行代码清空对象变量,释放系统资源。
示例代码运行结果如下。

使用字典对象获取数据唯一值与重复值的其他应用场景与此示例基本上是大同小异的,只需要做少量代码修改即可。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值