VBA(7)字典及常用应用

这篇具有很好参考价值的文章主要介绍了VBA(7)字典及常用应用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、字典直接创建

Dim dic as object

Set dic = Createobject("scripting.dictionary")

2、引用法

工具-引用-浏览-scrrun.dll-确定

microsoft scripting runtime   打勾

注:两者在使用上经常用创建多一点;并无太大区别。用创建的字典装入数据后并不能直接用dic.keys(N)/dic.items(N) 的格式来引用字典元素.字典元素从 dic.keys(0)开始

3、字典常用的属性与方法

方法:

  .add         '创建新的元素

  .keys                 '字典的元素

  .items               '元素对应的值

  .exists               '是否存在

  .remove           '清除提定元素

  .removeall       '清除所有元素

属性:  

  .key

  .item

  .count                '统计元素个数

  .comparemode'值为1/0/2 文本/英文/数据库格式      '文本格式下不区分大小写

4、基础用法概念

Sub dic1()
    'Dim d As New dictionary                '需工具-引用-microsoft scripting runtime选取后
    Dim d As Object
    Dim arr()
    Dim x%
    Dim m
    Set d = CreateObject("scripting.dictionary")
        d.CompareMode = 1                   '设置为不区分大小写
    [A1:A3] = Application.WorksheetFunction.Transpose(Array("A", "B", "C"))
    [B1:B3] = Application.WorksheetFunction.Transpose(Array(1, 2, 3))
    arr = Range("a1:b3")
    For x = 1 To UBound(arr, 1)
        d(arr(x, 1)) = arr(x, 2)
    Next
    'Stop
    'MsgBox d.keys(2)                       '在本机测试需DIM new dictionary方式下方可用
    [C1:E1] = d.Keys                        '字典keys元素
    [C2:E2] = d.Items                       '字典一个key对应一个Item
    [C3] = d.Count                          '字典D统计元素组个数
    If d.Exists("D") Then                   'Exists查看元素是否存在
        MsgBox "1"
    Else
        'd("D") = 4                          '不存在则增加
        d.Add "D", 4                         'd.add =    d(key)=item
    End If
    Stop                                    '暂停查看字典变化
        d.Key("C") = "5"                     'd.key属性指定元素改变key值
        m = Application.Index(d.Keys, 3)     '用createobject创建的字典用工作表index函数取出赋值
        MsgBox m

    If d.Exists("c") Then                   '前期装入的是"C"。如果不设置区分大小写则不存在
        MsgBox "C存在"
    Else
        d.Remove "b"                        '字典按装入数据的顺序排序
    End If
        d.RemoveAll                        'd.remove 指定keys删除或者Removeall全部
    Stop                                    '暂停查看字典变化
End Sub

5、常见应用:读取数据/去重复/计算/匹配文章来源地址https://www.toymoban.com/news/detail-443200.html

Sub dic2()  '提取不重复
    Dim d As Object
    Dim arr()
    Dim x As Integer
    Set d = CreateObject("scripting.dictionary")
    d.CompareMode = 1                                                    '设置不分大小写
    [A1:A10] = Application.Transpose(Array("A", "B", "C", "a", "B", "C", "A", "B", "C", "D"))
    [B1:B10] = Application.Transpose(Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10))
    For x = 1 To 10
        d(Cells(x, 1).Value) = Cells(x, 2).Value + d(Cells(x, 1).Value)        '合并相对应累加,相当于SUMIF
        'd.Add Cells(x, 1).Value, Cells(x, 2).Value                      '用add如遇有重复情况会报错
    Next
    Range("d1").Resize(d.Count) = Application.Transpose(d.Keys)         '字典Keys关键字如装入重复则覆盖上一个,利用此特性可去重复,转置输出单元格
    Range("e1").Resize(d.Count) = Application.Transpose(d.Items)        '对应值汇总值输出
    arr = d.Items
    Stop
End Sub
Sub dic3()  '查询匹配
    Dim d As Object
    Dim x%, y%
    Dim arr()
    [A1:A6] = Application.Transpose(Array("A", "B", "C", "a", "d", "D"))
    [B1:B6] = Application.Transpose(Array(1, 2, 3, 4, 5, 6))
        Set d = CreateObject("scripting.dictionary")
        arr = Range("a1:b6")
        For y = 1 To UBound(arr)
            d(arr(y, 1)) = arr(y, 2)            '把双列的数据分别装入1与2列,对应的值相互查询
            d(arr(y, 2)) = arr(y, 1)
        Next
        Stop
    MsgBox d("a") & d(1) & d("A")
End Sub
Sub dic4()  '多列汇总,字典key1列对应item多列
    Dim hrr(1 To 100, 1 To 3)       '定义一个足够大的放汇总数组
    Dim row As Integer
    Dim arr(), x#, k#
    Dim d As Object
    Set d = CreateObject("scripting.dictionary")
    [A1:C1] = Array("品名", "汇总1", "汇总2")   '生成测试用数值
    [A2:C2] = Array("A", "1", "5")
    [A3:C3] = Array("A", "2", "6")
    [A4:C4] = Array("C", "3", "7")
    [A5:C5] = Array("C", "4", "8")
    arr = Range("a2:c" & Range("a65536").End(xlUp).row)
    For x = 1 To UBound(arr)
        If d.Exists(arr(x, 1)) Then         'Exists某个元素在字典中是否存在
            row = d(arr(x, 1))      '如果存在。行数等于字典中的顺序序号
            hrr(row, 2) = hrr(row, 2) + arr(x, 2)       '对应累加
            hrr(row, 3) = hrr(row, 3) + arr(x, 3)       '如果计数将累加数值改1
        Else
            k = k + 1               '如果不存在。记录序号
            d(arr(x, 1)) = k            '装入字典
            hrr(k, 1) = arr(x, 1)           '数组直接装入对应数值
            hrr(k, 2) = arr(x, 2)
            hrr(k, 3) = arr(x, 3)
        End If
        Next
        Range("G2").Resize(k, 3) = hrr      '汇总后结果输出
End Sub
Sub dic5()      '交叉表样式汇总
    Dim hrr(1 To 100, 1 To 4)
    Dim d As Object
    Dim row1&, column1&
    Dim arr(), x#, k#
    Set d = CreateObject("scripting.dictionary")
    [A1:C1] = Array("品名", "月份", "值")
    [A2:C2] = Array("A", "1月", "5")
    [A3:C3] = Array("A", "2月", "6")
    [A4:C4] = Array("C", "3月", "7")
    [A5:C5] = Array("C", "2月", "8")
    arr = Range("a2:c" & Range("a65536").End(xlUp).row)
    For x = 1 To UBound(arr)
        column1 = (InStr("1月2月3月", arr(x, 2)) + 1) / 2 + 1 'InStr(查找的字符串,找什么字符)返回字符所在位置排列的数字
        If d.Exists(arr(x, 1)) Then
            row1 = d(arr(x, 1))
            hrr(row1, column1) = hrr(row1, column1) + arr(x, 3)
        Else
            k = k + 1                       '多行多列汇总值在于确定行数装入,及怎么样区别列值
            d(arr(x, 1)) = k                '需注意列值是单条件还是多条件取值
            hrr(k, 1) = arr(x, 1)
            hrr(k, column1) = arr(x, 3)
        End If
    Next
    Range("f1:h1") = Array("品名/月份", "1月", "2月")
    Range("f2").Resize(k, 3) = hrr
End Sub
Sub dic6()  '指定条件求整余
    Dim d As Object
    Dim x%
    Dim arr()
    Set d = CreateObject("Scripting.Dictionary")
    For x = 1 To 10
        d.Add x & IIf(Abs(x Mod 3) = 0, "@", ""), ""    '循环1至10如果符合则加标识号@
    Next
    arr = WorksheetFunction.Transpose(Filter(d.Keys, "@"))  '筛选只有标识号的值
    [A1].Resize(UBound(arr), 1) = arr                       '筛选完之后输出单元格"3@,6@,9@"
    [A:A].Replace "@", ""                                   '替代掉标识符
    Set d = Nothing                                         '关闭字典
End Sub
Sub dic7()      '指定类型分类并提取不重复
    Dim str1$, str2$, str3$
    Dim nRow%, d As Object
    Dim Brr(), arr
    Dim s(1 To 4) As Integer, i%
    Set d = CreateObject("scripting.dictionary")
    str1 = Join(Array("类型1A", "类型1B", "类型1C"), ",")      '定义类型1,以数组形式储存
    str2 = Join(Array("种类2A", "种类2B", "种类2C"), ",")      '定义类型2,以数组形式储存
    str3 = Join(Array("型3A", "型3B", "型3C"), ",")      '定义类型3,以数组形式储存
    nRow = Range("a1").End(xlDown).row
    arr = Range("a1:a" & nRow)                          '数据源装入
    ReDim Brr(1 To nRow, 1 To 4)                        '筛选后放置数组
    For i = 2 To nRow                                       '遍历数据源
        If Not d.Exists(arr(i, 1)) Then                         '如果数据不存在执行
            d(arr(i, 1)) = ""                                  '放入字典
            If str1 Like "*" & Left(arr(i, 1), 2) & "*" Then'类型文本1中有跟遍历值相像的话
                s(1) = s(1) + 1                                 '记录类型1列的行累加
                Brr(s(1), 1) = arr(i, 1)                            '赋值给1列
            ElseIf str2 Like "*" & Left(arr(i, 1), 2) & "*" Then
                s(2) = s(2) + 1
                Brr(s(2), 2) = arr(i, 1)
            ElseIf str3 Like "*" & Left(arr(i, 1), 2) & "*" Then
                s(3) = s(3) + 1
                Brr(s(3), 3) = arr(i, 1)
            Else
                s(4) = s(4) + 1                               '都与123类型不类似的放入第4列
                Brr(s(4), 4) = arr(i, 1)                        '记录4列的行累加
            End If
        End If
    Next
    [K1:N1] = Array("类型1", "种类2", "型3", "其他")
    Range("k2:n" & nRow) = Brr                              '输出结果到单元格
End Sub

到了这里,关于VBA(7)字典及常用应用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • CANopen | 对象字典OD 05 - 创建对象字典变量,映射到RPDO

    该章节的源代码地址:github 以上摘自《CANopen_easy_begin》的第7章。 CANopen从站有一个变量rx_Value,映射到PDO1上。接着,CANopen主站通过CANopen协议修改CANopen从站的变量rx_Value。 使用Objdictedit软件打开文件夹/obj_dir/Slave1.od对象字典。 在0x2000~0x5FFF的地址创建变量rx_Value,类型是uint1

    2024年02月09日
    浏览(58)
  • Pycharm常用快捷键【快查字典版】

    我们写代码的时候回发现有很多黄色的波浪号,类似下图中的 这个时候可以点击任意黄色波浪号的代码,然后按下【Ctrl + Alt + L】进行代码格式化 格式化效果 如果想将下图的代码合并为一行,可以全选它们,然后按【Crtl+Shift+J】即可合并代码为一行,还会自动补充代码 合并

    2023年04月27日
    浏览(46)
  • CANopen | 对象字典OD 07 - 创建对象字典变量,变量变化时发送TPDO1,滤波时间200ms

    该笔记的程序:github CANopen从站有一个变量tx_Value,映射到TPDO1上。接着,当变量tx_Value发生变化时,通过TPDO1发送出去,滤波时间为200ms。 跟上一章节一样,创建一个变量tx_Value。 通过变量tx_Value映射到TPDO1上。 Transmission Type必须设置0xFF,然后Inhibit Time设置2000,单位0.1ms的话,

    2023年04月16日
    浏览(29)
  • Python中将字典转换为字符串常用的方法!

    在Python中,字典是一种很常见的数据类型,其由一组键值对组成的无序集合,有时候需要将字典转换为字符串,以便于在网络传输、文件存储等场合使用。那么如何将字典转换为字符串格式呢?以下是详细的内容: 1、使用json库 json是一种轻量级的数据交换格式,它可以将Pyt

    2024年02月08日
    浏览(66)
  • 【Python入门【推导式创建序列、字典推导式、集合推导式】(九)

    👏作者简介:大家好,我是爱敲代码的小王,CSDN博客博主,Python小白 📕系列专栏:python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发 📧如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀 🔥如果感觉博主的文章还不错的

    2024年02月15日
    浏览(66)
  • VBA高级应用30例应用2:MouseMove鼠标左键按下并移动鼠标事件

    《VBA高级应用30例》(版权10178985),是我推出的第十套教程,教程是专门针对高级学员在学习VBA过程中提高路途上的案例展开,这套教程案例与理论结合,紧贴“实战”,并做“战术总结”,以便大家能很好的应用。教程的目的是要求大家 在实际工作中分发VBA程序,写好的

    2024年04月27日
    浏览(41)
  • 让自己开发的VBA应用能够批量发送邮件(可带多个附件)

    当我们开发了一个VBA应用,很多时候需要让它能够自动批量发送邮件。这时候,我们就需要使用到CDO了。CDO全称Collaboration Data Objects,即协作数据对象,是Office 软件不在产品安装的一部分。它是通过基于COM的API提供对Outlook兼容对象的访问的包。CDO有多个组件,其中Message组件

    2024年02月11日
    浏览(42)
  • Hotspot源码解析-第二十章-字典表创建和基础类预加载(四)

    20.5.1 systemDictionary.cpp/hpp 20.5.1.1 SystemDictionary::initialize 20.5.1.2 initialize_preloaded_classes 这一部分也用到了很多宏定义,咱们先把宏展开后再来讲解 要使用的宏已经展开了,下面接着讲正题 SystemDictionary::initialize_wk_klasses_until SystemDictionary::initialize_wk_klass

    2024年01月19日
    浏览(36)
  • Object类的常用方法

    (1) clone方法 保护方法,实现对象的浅复制,只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异常。 主要是JAVA里除了8种基本类型传参数是值传递,其他的类对象传参数都是引用传递,我们有时候不希望在方法里讲参数改变,这时就需要在类中复写

    2024年02月15日
    浏览(40)
  • 云计算虚拟化技术与开发-------虚拟化技术应用第三、四章内容(QUME命令的讲解以及常用的QUME命令、创建虚拟机镜像文件以及启动虚拟机的常用QEMU命令)

    目录 第三章关于QUME的命令讲解 常用的QEMU命令:      kvm的内存的配置:  两种方式查看内存信息:  查看QEMU支持的镜像文件格式:qemu-img -h。 创造虚拟机镜像格式的命令:  下面介绍qemu-img的基本命令及语法 QUME中详细命令讲解:  第五章:实训和实验内容,如果不会就

    2024年02月15日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包