[問題] VBA 多層字典

作者: kumasan123 (熊先生)   2022-01-22 22:03:02
(若是和其他不同軟體互動之問題 請記得一併填寫)
軟體: Excel
版本: Microsoft 365
各位先進好,請教VBA的多層字典用法。
想透過字典Key值唯一特性來整理採買水果(知道其他方式也可達成同樣效果,但想請教多層字典用法),請教如圖二問號的程式碼。
如有表達不清楚之處,請見諒並告知。
http://i.imgur.com/Q6QUCWG.jpg
http://i.imgur.com/HKlaLRF.jpg
作者: waiter337 (給開司一罐蘇格登)   2022-01-23 00:19:00
我教你去破你找空白處 輸入'dic.keys() 跟 'dic.items()新增監看視前面的'不要選到 然後各新增一個監看式 你就看懂了另外 我不知道你的問題 brr並不是字典 是陣列上面的dic.keys() 跟dic.items()是第一層忘了說 要查看都得在程式運行時設中斷點才有資料而第二層就得要看你第一層的資料代入才有辦法看的到dic是物件 不像陣列會有第二層自動顯示我做個圖好了
作者: kumasan123 (熊先生)   2022-01-23 00:54:00
http://i.imgur.com/2Rt3exY.jpgw大您好,我試您的方法,有辦法知道第三層嗎?http://i.imgur.com/dPif8GQ.jpg
作者: waiter337 (給開司一罐蘇格登)   2022-01-23 00:59:00
https://i.imgur.com/wcp5r2W.png會第一第二層 就會第三層看你是要用"文字" 還是dic.keys()(0)(0)dic("文字")("文字")("文字")當然你也可以直接用變數 'dic(SerDate)或者'dic(SerDate)(Names) 但上述這兩種 都只會出現一下就消失 會跟著變數變化這裡偏難 要花幾個小時玩玩看我更正一下 你的兩張圖 都只有在第一層我大概打一些 你試看看'dic.keys()(0)(0)dic(#2021/10/7#)'dic.keys()(0)(0)(0)怕你觀念有問題 我補充一下
作者: kumasan123 (熊先生)   2022-01-23 01:12:00
沒錯,的確是一開始新增監看,會直接就地建立該字典。
作者: waiter337 (給開司一罐蘇格登)   2022-01-23 01:12:00
每一層 都有key 跟 item而keys() 跟items() 是"總集合"
作者: kumasan123 (熊先生)   2022-01-23 01:14:00
好的,我早上會試試,非常不好意思晚上還讓您解說。再次感謝。
作者: waiter337 (給開司一罐蘇格登)   2022-01-23 01:15:00
該層的總集合我的講解內也有一些小錯誤 用自己的直覺去玩學比較快'dic.items()(0)(0)
作者: kumasan123 (熊先生)   2022-01-23 12:50:00
http://i.imgur.com/yBXMTl2.jpg我試著用Dic()(0)(0)也是看不到第三層水果,要怎麼監看到水果或輸出到Excel儲存格(如Names) 表達方式?
作者: waiter337 (給開司一罐蘇格登)   2022-01-23 17:34:00
都要試試看阿dic.keys()(0)dic.keys()(0)(0)dic.keys()(0)(0)(0)dic.items()(0)dic.items()(0)(0)dic.items()(0)(0)(0)dic(#2021/10/7#)("james")就是玩 要玩出規律
作者: kumasan123 (熊先生)   2022-01-23 22:57:00
謝謝w大的引導,有抓住一些線索了。
作者: waiter337 (給開司一罐蘇格登)   2022-01-24 09:12:00
你想要監看的話...names 是在第二層通常作法如你一開始提供的範例會先將字典篩好去重的資料 依照順序轉放入brr陣列裡面然後再去找brr 的第二欄 跑迴圈不過 此種方式有多種操作 可以選擇自己需要的方向比如依照原本範例 他是導出dic.keys()也可以用迴圈導出其他東西 如dic.items()就要看你的需求他的brr(jloop,3) ="" 這行確實沒任何用途可能是原先準備要拿來預備用的當然你也可以利用迴圈 for i = 1 to dic.count上述更正for i = 0 to dic.count然後搭配 dic.items()(i).count 去跑 多層迴圈不過還有一種方法也可以 比較常見這種方法通常運用在爬蟲或者網頁上用for each d0 in dic 先遍例第一層遍歷然後 第二層 再用 for each d1 in d0 再跑一圈接著判斷d1 是否有東西
作者: kumasan123 (熊先生)   2022-01-24 20:00:00
w大真熱心。我原本用意兩份資料(A與B資料)先比對,先將B資料寫入字典內,再以A資料檢驗,若存在則進行後續資料處理。試過幾個方式,如您上述提到的For Each也試過。後來遇到問題想排除,想使用監看方式觀察,發現第三層第四層的監看設定不出來,例如Dic() (0)(0).keys還是不行(慚愧)。所以改用字典寫入Brr,再轉寫至儲存格,第三層也就卡住了。後來A資料比對就用Exists比對,遇到另一個問題此處需要物件(階段錯誤424),現在也在排除中。
作者: waiter337 (給開司一罐蘇格登)   2022-01-24 20:10:00
要查key 要用items()(0)(0)(0)要查item 要用dic.keys()(0)(0)(0) 數字可以自己調整因為不一定每個都有三層更正 要查key 要用dic.items()(0)(0)(0)dic.items()(0)(0)(0).......看幾層 用幾層另外提供一個情報 dic雖然在vba使用上能用自動去重
作者: kumasan123 (熊先生)   2022-01-24 20:14:00
是的,經由提示,才知道是在item內 XD。
作者: waiter337 (給開司一罐蘇格登)   2022-01-24 20:14:00
但實際上的字典 無法自動去重 若你未來有用到其他語言就需要靠exist確認是否存在才能放入 以免會bug但vba不影響
作者: kumasan123 (熊先生)   2022-01-24 20:18:00
咦,是透過exist來去重嗎?我之前想重複給予同一個key,可能會蓋掉原本的item值但是不會新增key值。
作者: waiter337 (給開司一罐蘇格登)   2022-01-24 20:18:00
補充 並不是在item內vba 本身有自動去重的功能 但其他語言沒有例如vb.net而是key 跟 item 本身就是相互存在的比如 你 跟 身分證字號假如 我指"你" 那麼代表 我要的是身分證字號反之 我給了身分證字號 那麼 我要的是"你"比如 張三 a123456789那麼 我查張三 我要的答案就是a123456789而我查a123456789 而該給我的答案就是 張三若複雜一點 a123456789 可以不只是文字 還可以是物件才會出現這種層層疊加的狀態也就是說 如範例 你可能創了幾百個字典 只不過字典包著其他的字典雖然看起來只有dic 一本字典 但裡面還有上百個字典比如dic(#2021/1/7#) <--這裡面可能又藏了一本字典
作者: kumasan123 (熊先生)   2022-01-24 20:26:00
謝謝熱心回答及舉例說明。嗯嗯,多層字典,我看左岸論壇另一個說法字典嵌套。都是表達同樣意思。
作者: waiter337 (給開司一罐蘇格登)   2022-01-24 20:33:00
是的
作者: kumasan123 (熊先生)   2022-01-27 09:53:00
驚!沒想到w大持續光臨XD。當時有想到移除重複項後再寫入陣列,一樣可達到去重效果,但考量到在陣列取出多重條件比對後的結果有點難(可能有其他我不知道的解法),所以就採用多層字典。

Links booklink

Contact Us: admin [ a t ] ucptt.com