一、認識字典嵌套字典 字典嵌套字典本論壇貌似沒有什么教程,也沒有見大佬解講過,好多新手會覺得這個很神奇,看不懂得。我剛學習時也是一知半解,不知道怎么運用,于是乎就通過兩個字典或者更多的字典來解決字典嵌套字典的問題,后面看到大神用的多了,自己理解了一下,其實字典嵌套字典很簡單,只要大家能熟悉運用字典,這個嵌套就不是問題。 我想跟大家說的是,字典嵌套字典,你不用管它嵌套了幾層,它終究也是字典,那么字典最重要的就是兩樣東西,Key 和 Item,即是關鍵詞和指定的鍵的條目值。大家可以看看彭希仁老大的簡要教程。 https://club./thread-926188-1-2.html?_dsign=0e9b58b6 這里我想讓大家注意的是Key它可以是文本或者數字,而Item可以是文本、數字、數組,單元格,甚至是一個容器,知道了這個再來理解字典嵌套字典就不是問題了。大家難以理解字典嵌套字典,是因為我們平時一般使用變量d、dic來表示一個字典,其實a、b、c、Arr、Brr、一、二、李四、王五都可以表示字典,你明白了這個就基本上明白完了。 下面以例子來進行說明吧,以下圖所示。 大家想想,這里面到底有幾個字典,新手朋友可能想到是一個字典,因為在本地窗口中只發現一個字典,其實這里面有六個字典,分別是d、d(1)、d(2)、d(3)、d(4)、d(5),千萬不要以為d、d(1)是同一個字典。 咱們來聊聊字典嵌套字典這一句關鍵代碼:Set d(i) = CreateObject('scripting.dictionary'),這里面d是一個字典,i是字典d的關鍵詞,當i循環等于1是,關鍵詞是1,Item是CreateObject('scripting.dictionary'),上面我說過了字典的item可以是任何東西,這里就是把d(1)創建成一個字典,同時添加了關鍵詞1,對應的條目就是創建一個字典。下面來到d(i)(j) = j這一句代碼,假設i=1,j=1,那么就是d(1)(1)=1,表示的意思是,字典是d(1),d(1)的關鍵詞是1,d(1)對應的鍵值是1,這樣子大家應該都明白了吧。 有人可能會問,我能不能自己創建嵌套字典,其實是可以的,如我們繼續在后面添加Set d(8) = CreateObject('scripting.dictionary'),Set d('一') = CreateObject('scripting.dictionary'),那么字典d就增加了兩個關鍵詞,分別是8和“一”,而我們也創建了兩個字典,分別是d(8)、d('一“),我們可以分別向這兩個字典中添加關鍵詞及鍵值。 這樣子大家都清楚了吧,有人問了,為什么在本地窗口中看不到創建的嵌套字典,我也不清楚什么原因,VBA中不允許直接創建帶有()的字典,如直接創建Set d('一') = CreateObject('scripting.dictionary'),這是不允許的,你必須先創建字典d,才可以繼續創建d()這樣子的字典,反正你定義dim d('一') as Object,肯定是出錯的,所以我們要在本地讀取它們,就用一個變量取出來就可以看到了,如a = d(2).keys, b = d(3).items,大家看我下面的圖。 大家通過本地窗口,把一個變量賦值給嵌套的字典,就會把字典嵌套字典的皮扒完。大家自己嘗試把d、d(1)、d(2)、d(3)的關鍵詞、鍵值讀取出來放到單元格中。說了這么多,大家估計對字典嵌套字典有了更深的認識。下面我來聊聊字典嵌套字典的用法,用實例來講解。 二、字典嵌套字典運用方法 字典嵌套主要用在有分組的數據中,如經典的按列拆分工作表、工作簿,有分組用字典嵌套字典來簡單明了,第一層字典獲得分組關鍵詞,第二層字典以分組關鍵詞創建字典,第二層字典的關鍵詞取得定位,然后把這些行放入到數組當中,這個就是字典嵌套字典的經典用法。 咱們先來一個簡單的,一 一對應 ,即關鍵詞與鍵值關系,把字典嵌套字典的值取出來。如下圖所示,一維轉二維。 姓名有分組,有多個值,所以可以利用字典嵌套字典,對應代碼 我們以A列B列合并作為字典的dic的關鍵詞,C列科目作為嵌套字典的關鍵詞,D列成績作為嵌套字典后的鍵值,然后我們通過循環把這些嵌套字典的鍵值放回到二維表中。Arr(n, j) = dic(k)(Arr(1, j))這里dic(k)就是一個嵌套字典,Arr(1, j)是它的關鍵詞,如取第一個字典dic的關鍵詞就是”張三“,那么創建的嵌套字典就是dic(”張三“),它的第一個關鍵詞是”語文“,所以dic(”張三“)(”語文“)對應的鍵值是76,我們把它放到數組Arr(2,3)中存放,其它依次取值就得到Arr數組,回填寫到單元格中就可以了。 咱們再來一個字典進行定位的,大家對嵌套就更加深刻了,按列拆分成工作表。如下圖所示: 我們要按照 H列的項目進行拆分工作表,有分組那么就可以字典嵌套字典,這里我們就是H列作為字典dic的關鍵詞,以dic(關鍵詞)創建嵌套字典,嵌套字典的關鍵詞為行號,這樣子就能定位,且不會有重復,嵌套字典對應的鍵值可以為空,也可以引用整行,因為我們已經定位好了,所以嵌套字典對應的鍵值不需要也沒有關系,有時候我們也可以使用嵌套字典對應的鍵值等于行號,用鍵值來進行定位也是可以的,大家都可以嘗試,我上傳的兩個附件中也有相對應的代碼。 先看這個簡單的代碼吧,dic(key)(i) = Application.Index(Arr, i),嵌套字典的鍵值我們直接用數組的一行,也就是工作表中的A:H的某行,用這個也想跟大家說明,字典的鍵值可以為一個數組。For Each k In dic.keys這里就是,k就是分組的依據,即是第一層字典的關鍵詞,這里是'合新項目'、'集大原項目'……,而嵌套的字典就是dic('合新項目'),嵌套字典的關鍵詞為行號,舉個例子dic('合新項目'),1,2,3行都是它的關鍵詞,而A4:H6是它的對應的鍵值,然后再通過Application.Rept(dic(k).items, 1)來把鍵值輸出來。 同是這個例子,我們不要嵌套字典的鍵值,大家可能會更清晰明了。 上面的代碼中,k也是分組的依據,即是第一層字典的關鍵詞,這里是'合新項目'、'集大原項目'……,而kk就是行號,我們既然有了Arr的行號,那么在結果Brr中,我們循環一下就得各個分組的數據了,這個我覺得就是最經典的字典嵌套字典的用法了。 好了,就聊到這里吧,不知道說的對不對,我也是小白,希望大家多多指教。 |
|