暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

VBA 初识字典(Dictionary)

Excel VBA练习 2021-07-15
4774

    在VBA中,数组可以用于数据的读取清洗以及整理,而字典则用于数据的分析以及汇总,条件查询等

    其中字典(Dictionary)具有独特的属性和方法,但该对象并非VBA内部集成的对象,需要添加引用才可以在VBA中使用

    字典对象被集成在Scrrun.dll动态链接库中,在使用前需要先注册该动态链接库

绑定字典有两种方式,一种是前期绑定,另外一种则是后期绑定


  • 前期绑定

    在编辑器中,工具→引用→列表中找到"(Microsoft Scripting Runtime)"选框,勾选确定即可



    前期绑定的字段在代码窗口输入代码即可自动列出成员列表


    Sub test()
    Dim Dic As New Dictionary
    End Sub



    • 后期绑定字典

        后期绑定指的是通过CreateObject函数创建字典对象的引用

      Sub test()
      Dim Dic As Object
      Set Dic = CreateObject("Scripting.Dictionary")
      End Sub


      • 前期绑定和后期绑定的区别

          前期绑定,在写代码的时候可以自动列出成员列表,效率也较高些,而且有些属性前期绑定是支持的,而后期绑定则不支持,但是前期绑定的代码并不适合其他人使用,毕竟有些人不知道怎么去绑定,并且编辑器也会检测类库是否丢失,如没找到,将产生编译错误

          后期绑定,后期绑定可以自动关联最佳版本的类库,使得代码的兼容性更强些,但在代码运行之前无法确定被引用对象的属性和方法,因此在输入代码时,不会列出成员列表,有些属性无法使用


      • 字典对象的常用方法和属性

          字典对象用于保存两个相关联的一维数组,分别以关键字Key组成的关键字列表与对应条目Item组成的元素列表

          并且关键字Key具有唯一性,在关键字Key所在代表的数组中,不允许出现重复数据,而条目Item则无此限制

          按照以上的解析参数Key可以指定任意数据类型的值,参数Item也可以指定任意数据类型的值,甚至可以是数组、集合或者字典

          

      1. Add

          使用字典对象的Add方法可以将一组关联的关键字(Key)与条目(Item)添加到字典对象中

         

      语法为:

        DicObject.Add Key,Item

        示例

          Sub test()
          Dim Dic As New Dictionary
          Dic.Add "ByVba", "每天学习一点点"
          MsgBox Dic("ByVba")
          Set Dic = Nothing
          End Sub

          输出结果

              由于字典的关键字Key具有唯一性,如在同一对象中,就不能使用Add方法在此添加相同的关键字,否则会出现以下错误

                  

                        

          所以可以这样写 ,直接给字典元素赋值

            DicObject(Key)=Item
              Sub test()
              Dim Dic As New Dictionary
              Dic("ByVba") = "每天学习一点点"
              Dic("ByVba") = "再次添加"
              MsgBox Dic("ByVba")
              Set Dic = Nothing
              End Sub

                  注意,如果字典中的关键字Key已存在,则会修改Key的Item值,若果关键字Key不存在则会添加新的关键字Key,如果不需要修改,就需要Exists方法


                  2.Exists

                  使用字典的Exists方法可以判断关键字Key是否存在字典中

              语法为:

                DicObject.Exists(Key)

                如下图所示


                  Sub test()
                  Dim Dic As New Dictionary
                  Dim aData, aKey, aItem, intX&
                  aData = Range("A1").CurrentRegion
                  For intX = 2 To UBound(aData)
                  If Not Dic.Exists(aData(intX, 1)) Then
                  Dic(aData(intX, 1)) = aData(intX, 2)
                  End If
                  Next
                  aKey = Dic.Keys
                  aItem = Dic.Items
                  Set Dic = Nothing
                  Stop
                  End Sub

                  第6行代码使用字典的Exists方法判断以品牌作为关键字的Key是否存在字典中,如果不存在,则添加到字典中,并且相对应的数量作为Item,如果存在则忽略

                  第10和第11行,分别将Dic字典中所有的关键字Key以及条目Item转换为一维数组


                  取字典中所有的Key

                    DicObject=DicObject.Keys

                    取字典中所有的Item

                      DicObject=DicObject.Items

                      在本地窗口中可以看到字典中的所有Key以及Item


                        Sub test()
                        Dim Dic As New Dictionary
                        Dim aData, Mat, intX&
                        aData = Range("A1").CurrentRegion
                        For intX = 2 To UBound(aData)
                        If Not Dic.Exists(aData(intX, 1)) Then
                        Dic(aData(intX, 1)) = aData(intX, 2)
                        End If
                        Next
                        Debug.Print "关键字(Key)", vbTab, "条目(Item)"
                        For Each Mat In Dic.Keys
                        Debug.Print Mat, vbTab, Dic(Mat)
                        Next
                        Set Dic = Nothing
                        End Sub


                        或者在立即窗口查看



                        3.Remove

                            字典中的Remove方法用于删除字典对象中的一个关键字Key以及其对应的条目Item

                          DicObject.Remove Key
                            Sub test()
                            Dim Dic As New Dictionary
                            Dim aData, aKey, aItem, intX&
                            aData = Range("A1").CurrentRegion
                            For intX = 2 To UBound(aData)
                            If Not Dic.Exists(aData(intX, 1)) Then
                            Dic(aData(intX, 1)) = aData(intX, 2)
                            End If
                            Next
                            aKey = Dic.Keys
                            aItem = Dic.Items
                            Dic.Remove "三星"
                            MsgBox "字典中的关键字三星已" & IIf(Dic.Exists("三星"), "", "不") & "存在"
                            Set Dic = Nothing
                            Stop
                            End Sub

                            第12行代码使用字典的Remove方法,删除了字典对象中的关键字Key"三星"


                            4.RemoveAll

                                当一个字典在循环中需要重复使用的时候,就需要使用到RemoveAll方法

                              DicObject.RemoveAll
                                Sub test()
                                Dim Dic As New Dictionary
                                Dim aData, aKey, aItem, intX&
                                aData = Range("A1").CurrentRegion
                                For intX = 2 To UBound(aData)
                                If Not Dic.Exists(aData(intX, 1)) Then
                                Dic(aData(intX, 1)) = aData(intX, 2)
                                End If
                                Next
                                Dic.RemoveAll
                                MsgBox "字典中的还剩 " & Dic.Count & " 条记录"
                                Stop
                                Set Dic = Nothing
                                End Sub

                                第10行代码中,使用了字典的RemoveAll方法,将字典中的数据一次性清空

                                第11行使用了字典的Count属性,查看字典中的条数



                                收工!

                                如果觉得文章有用,点个赞+在看,你的每一次点赞和转发就是小编原创的动力

                                文章转载自Excel VBA练习,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                评论