查看: 24  |  回复: 0
  VBA代码 字典常用操作
楼主
发表于 2025年3月18日 15:13
'本模块 负责处理字典常用操作 封装为通用函数

Function ArrToDic(arr, keyCols, Optional Delimiter = "@@") As Object
    '数组去重得到不重复的行号 得到一个key-->多行行号集合
    '依次参数为 数组 关键字多列列号(逗号分隔的字符串,或者一维数组)
    'Delimiter 为关键字分隔符
    Dim i, dic, key, e
    If TypeName(keyCols) Like "*String" Then
        keyCols = Split(keyCols, ",")    '监测到字符串类型的多列参数 拆分为数组
    End If
    Set dic = CreateObject("scripting.dictionary")
    For i = LBound(arr) To UBound(arr)
        key = ""
        For Each e In keyCols    '构造多列key
            key = key & Delimiter & arr(i, e)
        Next
        key = Mid(key, Len(Delimiter) + 1)
        If Not dic.Exists(key) Then    '首次出现key的时候 创建集合
            dic.Add key, New Collection
        End If
        dic(key).Add i    '字典记录行号
    Next
    Set ArrToDic = dic
End Function

Function ArrQuChong(arr, keyCols, Optional IsFirst As Boolean = True, Optional Delimiter = "@@")    '数组去重
    '数组去重得到结果 可选取第一个出现还是最后一个出现
    '依次参数为 arr=数组 keyCols=关键字多列列号(逗号分隔的字符串,或者一维数组)
    'IsFirst=true代表取第一个 否则取最后一个
    Dim dic, e, i, j, c As Collection, n
    Set dic = ArrToDic(arr, keyCols)    '得到去重字典
    ReDim brr(1 To dic.Count, 1 To UBound(arr, 2))
    For i = 0 To dic.Count - 1
        Set c = dic.items()(i)    '取出集合
        n = IIf(IsFirst, 1, c.Count)    '决定取数的位置
        For j = LBound(arr, 2) To UBound(arr, 2)    '从源数据取出到结果数组
            brr(i + 1, j) = arr(c(n), j)
        Next
    Next
    ArrQuChong = brr
End Function

Sub 参数化字典去重test()
    Dim dic, arr
    Sheet3.Activate
    arr = E8_MaxRange(Sheet3.Range("A2:D2"))
    '去重输出
    brr = ArrQuChong(arr, "1,3")    '得到公司+部门去重结果
    crr = ArrQuChong(arr, "1,2")    '得到公司和服务内容去重结果
    drr = ArrQuChong(arr, "1,3,4")    '得到公司和服务内容去重结果
    Range("F2").Resize(1000, 100).ClearContents
    Range("F2").Resize(UBound(brr), UBound(brr, 2)) = brr
    Range("K2").Resize(UBound(crr), UBound(crr, 2)) = crr
    Range("P2").Resize(UBound(drr), UBound(drr, 2)) = drr
End Sub


您需要登录后才可以回帖 登录 | 立即注册
【本版规则】请勿发表违反国家法律的内容,否则会被冻结账号和删贴。
用户名: 立即注册
密码:
2020-2025 MaNongKu.com