數據字典,VBA進階在VBA中使用字典進行數據統計與查詢

            抖帥宮 1062 2023-10-05

            數據字典,VBA進階在VBA中使用字典進行數據統計與查詢-第1張-觀點-玄機派

            來源頭條作者:小智雅匯

            字典作為一種復合數據類型和封裝有屬性和方法的對象,自然比自己定義來得更加方便、安全和有效率。

            字典其實就是一些“鍵-值”對。在很多場合,它都能起到很大的作用,使用起來非常方便,有類似于微型數據庫的作用,可用于臨時保存一些數據信息。

            字典相當于一個多行二列的二維數組或單元格數據區域。

            字典這種數據結構有兩個很重要的特性:

            I key(鍵)不允許重復。當給字典元素賦值時,不存key時可以新建,存在key時可以更新值。利用這個特性可以很方便地做一些數據匯總的工作。這個機制就會形成鍵值覆蓋。這是字典區別于VBA的另一種數據類型,集合(Collection)的一個重要方面。如果你曾經試圖改變某個與Collection對象成員對應的鍵值,那么你知道這不可能。當對象成員加入到Collection對象時,該成員的數據和鍵值就已經被固定下來了。你能做的唯一選擇就是使用Remove方法清除該成員并增加一個新成員到該對象。但是,你能夠利用字典(Dictionary)對象的Key特性來覆蓋該鍵的鍵值。

            II 數據元素通過key進行索引,我們知道,數據是通過下標進行索引的,所以順序很重要。而字典是通過key進行索引的,所以不考慮元素順序。通過key進行索引,在特定的場合,有它的優勢所在。

            1 聲明字典

            VBA中創建字典有兩種方法:

            1.1 引用聲明

            在VBE菜單中,選擇“工具-引用”,在彈出的對話框中選擇中邊的“瀏覽”,此時會打開Windows系統的驅動目錄(C:\Windows\System32),然后找到scrrun.dll,確定確定返回就行了。

            添加引用后,就可以像定義其它變量一樣聲明使用字典了。

            Sub test()

            Shell ("Regsvr32 C:\Windows\System32\Scrrun.dll") 'Dos 下運行注冊DLL

            'Toos ->References ->Microsoft Scripting Runtime 'VBE中工具、引用

            Dim dic As New Dictionary '前期綁定后就可以直接定義字典類型變量并初始化

            For i = 1 To 10

            dic(i) = i * 10

            Next

            t1 = dic.keys(2) '然后就可以直接讀取第3個字典元素的關鍵詞(注意字典數組是0開始)

            t2 = dic.Items(2) '同樣可以直接讀取第3個字典元素的項目內容(注意字典數組是0開始)

            End Sub

            1.2 直接聲明

            Dim d As Object

            Set d = CreateObject("Scripting.Dictionary")

            2 字典的方法

            既然是一種對象類型,它肯定封裝了若干成員方法和屬性。

            字典有6個成員方法,分別是Add、Exists、Keys、Items、Remove、RemoveAll。使用方法如下:

            2.1 Add

            用于添加內容到字典中。

            d.Add key, item

            第一個參數為鍵,第二個參數為鍵對應的值。

            如d.Add "優秀", 80

            一般使用直接賦值的方式來把內容添加到字典中:

            d.(key) = item,如:

            dic("及格") = 60

            'Add [key/item] if key is new

            '如果key不存在則直接加入[key/item]

            dic("及格") = 70

            'Cover [item] if key is exists without Err

            '如果key存在則覆蓋更新item 且不產生key存在的錯誤提示

            '因此本質上,用這個方法給字典賦值、比使用 Dic.Add, item 更好!

            '如需要對key存在進行錯誤處理,可使用Dic.Exists(key)方法,更加靈活。

            2.2 Exists()

            用于判斷指定的關鍵詞是否存在于字典(的鍵)中。

            d.Exists(key)

            如果存在,返回True,否則返回False。通常會在向字典中添加條目的時候使用,即先判斷字典中是否已存在這個記錄,如果不存在則新增,否則進行其它的操作。

            2.3 Keys()

            獲取字典所有的鍵,返回類型是數組。

            d.Keys()

            值得注意的是,字典使用for each next結構進行遍歷時,返回的是key。

            For Each di In d

            k = k + 1

            Cells(k, 15) = dic(di)

            Next

            2.4 Items()

            獲取字典所有的值,返回類型是數組。

            d.Items()

            2.5 Remove()

            從字典中移除一個條目,是通過鍵來指定的。

            d.Remove(key)

            如果指定的鍵不存在,會發生錯誤。

            2.6 RemoveAll

            清空字典。

            d.RemoveAll

            3 字典的屬性

            字典有4個屬性:Count、Key、Item、ConpareMode

            3.1 Count

            用于統計字典中鍵-值對的數量。也可以簡單理解為統計字典中鍵的個數。

            常用在字典遍歷時配合循環使用,如:

            For i = 0 To d.Count - 1

            3.2 Key

            用于更改字典中已有的鍵。如:

            d.Key("apple") = "Orange"

            如果指定的鍵不存在,則會產生錯誤。

            3.3 Item

            用于寫入或讀取字典中指定鍵的值,如果指定的鍵不存在,則會新增。如:

            '讀取

            Debug.Print d.Item("apple")

            '寫入

            d.Item("apple") = 10

            3.4 CompareMode

            當用字符串做為key時是否區分大小寫,如 Dic.CompareMode=1不區分大小寫,Dic.CompareMode=0區分大小寫

            默認不寫是區分的。

            Sub test10()

            Dim dic

            Set dic = CreateObject("Scripting.Dictionary")

            dic.Add "D", 0

            dic.Add "d", 0

            '因為默認的是區域大小寫的,所以不報錯

            End Sub

            Sub test11() '不區分大小寫,

            Dim dic

            Set dic = CreateObject("Scripting.Dictionary") '后期綁定引用字典對象

            dic.CompareMode = 1

            dic.Add "D", 0

            dic.Add "d", 0

            '上面的代碼報錯了,因為dic.CompareMode = 1不區分大小寫,所以

            '你裝后大寫的D之后,再裝小寫的d,重裝了,報錯

            End Sub

            4 總結一下:字典元素的添加、訪問

            任何語言的復合數據類型,做為一種數據元素容器,都要考慮數據元素的增、查、刪、改,并用適當的成員方法封裝起來。

            4.1 字典元素的添加

            d.Add "a", "example1"

            d.Add "b", 9

            'd.Add "b", 7 'add重復key會報錯

            d("b") = 7 '這樣會直接覆蓋,不會報錯

            'd.Item("b") = 7 '與上者相同

            d("c") = "example2"

            4.2 字典元素值通過key的訪問

            Cells(1, 1) = d("a")

            'Cells(1, 1) = d.Item("a") '與上者相同

            5 字典映射到單元格區域

            '把字典中keys/items結果分別輸出到工作表的某一列

            [a1].Resize(Dic.Count) = WorksheetFunction.Transpose(Dic.keys) 'Output keys result

            [b1].Resize(Dic.Count) = WorksheetFunction.Transpose(Dic.items) 'Output items result

            6 實例應用:將單元格區域映射到數組,字典通過數組定義來匯總數據。

            如下圖所示,按姓名匯總數據:

            下面左邊數據是源數據,中間是使用VBA統計產生的數據,右邊是使用數據透視表產生的數據。

            Sub 數據匯總()

            Dim dict, mrow, arr

            Set dict = CreateObject("Scripting.Dictionary")

            mrow = Range("a" & Rows.Count).End(xlUp).Row

            arr = Range("A2:C" & mrow)

            For i = 1 To UBound(arr)

            dict(arr(i, 1)) = dict(arr(i, 1)) + arr(i, 3)

            Next i

            [f1] = [a1]

            [g1] = [c1]

            [F2].Resize(dict.Count, 1) = Application.WorksheetFunction.Transpose(dict.Keys)

            [G2].Resize(dict.Count, 1) = Application.WorksheetFunction.Transpose(dict.items)

            End Sub

            代碼運行后,實現與數據透視表匯總數據相同的效果。

            當然上面也可以不使用數組,直接引用單元格,但使用數據操作起來更方便,不需要考慮單元格偏移。

            7 實例應用:數組與字典配合使用統計數據

            如下,統計得票數:

            Sub 投票統計()

            Dim dict, mrow, arr

            Set dict = CreateObject("Scripting.Dictionary")

            mrow = Range("b" & Rows.Count).End(xlUp).Row

            arr = Range("B2:D" & mrow)

            For i = 1 To UBound(arr)

            For j = 1 To UBound(arr, 2)

            dict(arr(i, j)) = dict(arr(i, j)) + 1

            Next j

            Next i

            [G1] = "候選人"

            [H1] = "得票匯總"

            [G2].Resize(dict.Count, 1) = Application.WorksheetFunction.Transpose(dict.Keys)

            [H2].Resize(dict.Count, 1) = Application.WorksheetFunction.Transpose(dict.items)

            End Sub

            由于字典的“鍵、值”存儲模式只能對應多行兩列的數據結構,一列是鍵,一列是值。如果值匯總時需要考慮兩列的關鍵字,如某個表格的編排有三列數據,產品名稱、規格、數量,如果需要按產品名稱+規格去匯總數量。則需要考慮將產品名稱與規格通過字符串連接的方式連接起來做為字典的鍵。

            -End-

            上一篇:八字中三個劫煞 (命里兩個劫煞)
            下一篇:時間都去哪兒了劇本,到底是時間孕育出了宇宙還是宇宙孕育出了時間
            相關文章

             發表評論

            暫時沒有評論,來搶沙發吧~

            返回頂部小火箭
            精品亚洲成在人线AV无码| 亚洲美女一区二区三区| 亚洲中文字幕在线无码一区二区| 亚洲大成色www永久网站| 亚洲婷婷五月综合狠狠爱| 亚洲天堂免费在线视频| 亚洲一级特黄大片无码毛片| 亚洲M码 欧洲S码SSS222| 国产精品亚洲综合天堂夜夜| 亚洲AV无码专区国产乱码不卡| 亚洲人成电影网站色www| 亚洲中文字幕一二三四区| 男人天堂2018亚洲男人天堂| 亚洲人成综合网站7777香蕉| 中文日韩亚洲欧美制服| 亚洲最大中文字幕无码网站| 亚洲精品无码久久久久久| 亚洲精品无码成人片久久不卡| 亚洲风情亚Aⅴ在线发布| 亚洲av日韩综合一区久热| 在线播放亚洲精品| 亚洲国产精品一区二区第一页免 | 亚洲欧洲精品国产区| 亚洲码在线中文在线观看| 亚洲国产成人久久99精品| 亚洲精品伊人久久久久| 亚洲欧美成人av在线观看| 国产精品亚洲综合网站| 在线观看亚洲精品国产| 亚洲爆乳精品无码一区二区三区| 亚洲精品高清视频| 亚洲春黄在线观看| 亚洲色大成网站www| 亚洲a∨无码精品色午夜| 亚洲国产精品综合久久一线| 最新国产AV无码专区亚洲| 亚洲国产精品高清久久久| 亚洲精品白色在线发布| 亚洲男人天堂2022| 亚洲不卡AV影片在线播放| 亚洲人成在线播放网站|