[問題] VBA 多層字典

看板Office作者 (熊先生)時間2年前 (2022/01/22 22:03), 編輯推噓4(40144)
留言148則, 2人參與, 2年前最新討論串1/1
(若是和其他不同軟體互動之問題 請記得一併填寫) 軟體: Excel 版本: Microsoft 365 各位先進好,請教VBA的多層字典用法。 想透過字典Key值唯一特性來整理採買水果(知道其他方式也可達成同樣效果,但想請教多層字典用法),請教如圖二問號的程式碼。 如有表達不清楚之處,請見諒並告知。 http://i.imgur.com/Q6QUCWG.jpg
http://i.imgur.com/HKlaLRF.jpg
----- Sent from JPTT on my Samsung SM-G9980. -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 175.181.157.93 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Office/M.1642860184.A.EC3.html

01/23 00:19, 2年前 , 1F
我教你去破
01/23 00:19, 1F

01/23 00:20, 2年前 , 2F
你找空白處 輸入'dic.keys() 跟 'dic.items()
01/23 00:20, 2F

01/23 00:20, 2年前 , 3F
新增監看視
01/23 00:20, 3F

01/23 00:21, 2年前 , 4F
前面的'不要選到 然後各新增一個監看式 你就看懂了
01/23 00:21, 4F

01/23 00:22, 2年前 , 5F
另外 我不知道你的問題 brr並不是字典 是陣列
01/23 00:22, 5F

01/23 00:27, 2年前 , 6F
上面的dic.keys() 跟dic.items()是第一層
01/23 00:27, 6F

01/23 00:27, 2年前 , 7F
忘了說 要查看都得在程式運行時設中斷點才有資料
01/23 00:27, 7F

01/23 00:28, 2年前 , 8F
而第二層就得要看你第一層的資料代入才有辦法看的到
01/23 00:28, 8F

01/23 00:29, 2年前 , 9F
dic是物件 不像陣列會有第二層自動顯示
01/23 00:29, 9F

01/23 00:30, 2年前 , 10F
我做個圖好了
01/23 00:30, 10F

01/23 00:54, 2年前 , 11F

01/23 00:55, 2年前 , 12F
w大您好,我試您的方法,有辦法知道第三層嗎?
01/23 00:55, 12F

01/23 00:55, 2年前 , 13F

01/23 00:59, 2年前 , 14F

01/23 01:00, 2年前 , 15F
會第一第二層 就會第三層
01/23 01:00, 15F

01/23 01:00, 2年前 , 16F
看你是要用"文字" 還是dic.keys()(0)(0)
01/23 01:00, 16F

01/23 01:01, 2年前 , 17F
dic("文字")("文字")("文字")
01/23 01:01, 17F

01/23 01:03, 2年前 , 18F
當然你也可以直接用變數 'dic(SerDate)
01/23 01:03, 18F

01/23 01:03, 2年前 , 19F
或者'dic(SerDate)(Names) 但上述這兩種 都只會出現
01/23 01:03, 19F

01/23 01:04, 2年前 , 20F
一下就消失 會跟著變數變化
01/23 01:04, 20F

01/23 01:07, 2年前 , 21F
這裡偏難 要花幾個小時玩玩看
01/23 01:07, 21F

01/23 01:08, 2年前 , 22F
我更正一下 你的兩張圖 都只有在第一層
01/23 01:08, 22F

01/23 01:09, 2年前 , 23F
我大概打一些 你試看看
01/23 01:09, 23F

01/23 01:09, 2年前 , 24F
'dic.keys()(0)(0)
01/23 01:09, 24F

01/23 01:09, 2年前 , 25F
dic(#2021/10/7#)
01/23 01:09, 25F

01/23 01:11, 2年前 , 26F
'dic.keys()(0)(0)(0)
01/23 01:11, 26F

01/23 01:11, 2年前 , 27F
怕你觀念有問題 我補充一下
01/23 01:11, 27F

01/23 01:12, 2年前 , 28F
沒錯,的確是一開始新增監看,會直接就地建立該字典。
01/23 01:12, 28F

01/23 01:12, 2年前 , 29F
每一層 都有key 跟 item
01/23 01:12, 29F

01/23 01:13, 2年前 , 30F
而keys() 跟items() 是"總集合"
01/23 01:13, 30F

01/23 01:14, 2年前 , 31F
好的,我早上會試試,非常不好意思晚上還讓您解說。再
01/23 01:14, 31F

01/23 01:14, 2年前 , 32F
次感謝。
01/23 01:14, 32F

01/23 01:15, 2年前 , 33F
該層的總集合
01/23 01:15, 33F

01/23 01:21, 2年前 , 34F
我的講解內也有一些小錯誤 用自己的直覺去玩學比較快
01/23 01:21, 34F

01/23 04:22, 2年前 , 35F
'dic.items()(0)(0)
01/23 04:22, 35F

01/23 12:50, 2年前 , 36F

01/23 12:53, 2年前 , 37F
我試著用Dic()(0)(0)也是看不到第三層水果,要怎麼監
01/23 12:53, 37F

01/23 12:53, 2年前 , 38F
看到水果或輸出到Excel儲存格(如Names) 表達方式?
01/23 12:53, 38F

01/23 17:34, 2年前 , 39F
都要試試看阿
01/23 17:34, 39F
還有 69 則推文
01/24 20:30, 2年前 , 109F
是表達同樣意思。
01/24 20:30, 109F

01/24 20:33, 2年前 , 110F
是的
01/24 20:33, 110F

01/26 10:41, 2年前 , 111F
如果不要去重 就用陣列會更方便點= = 因為我觀察這題
01/26 10:41, 111F

01/26 10:41, 2年前 , 112F
其實用陣列應該會更適合
01/26 10:41, 112F

01/26 10:42, 2年前 , 113F
比如你的第一個是2021/1/7
01/26 10:42, 113F

01/26 10:42, 2年前 , 114F
更正2021/10/7號
01/26 10:42, 114F

01/26 10:42, 2年前 , 115F
你可能會懷疑 陣列該怎麼做會適合
01/26 10:42, 115F

01/26 10:43, 2年前 , 116F
其實 日期非常適合用陣列
01/26 10:43, 116F

01/26 10:43, 2年前 , 117F
因為2021/10/7 的通用格式數字 就是44476
01/26 10:43, 117F

01/26 10:43, 2年前 , 118F
那接著下一個問題就是 我要怎麼創陣列
01/26 10:43, 118F

01/26 10:43, 2年前 , 119F
陣列的創造有個特性 不一定要從0開始創
01/26 10:43, 119F

01/26 10:44, 2年前 , 120F
甚至vba 還可以從負的開始創 這目前不在討論範圍
01/26 10:44, 120F

01/26 10:44, 2年前 , 121F
也就是我們 可以這樣創
01/26 10:44, 121F

01/26 10:45, 2年前 , 122F
redim ar(44476 to 50000,20,20)
01/26 10:45, 122F

01/26 10:45, 2年前 , 123F
至少每個日期能放20人 每個人 還能放20種水果
01/26 10:45, 123F

01/26 10:46, 2年前 , 124F
而且還不會卡住
01/26 10:46, 124F

01/26 10:46, 2年前 , 125F
這題目剛好是多維陣列 目前是3維
01/26 10:46, 125F

01/26 10:46, 2年前 , 126F
接著下個問題就是 每個日期內的資料 數量都不同怎麼辦
01/26 10:46, 126F

01/26 10:47, 2年前 , 127F
由於我們創的陣列第3維是從0~20
01/26 10:47, 127F

01/26 10:47, 2年前 , 128F
也就是資料從1~20放入就好
01/26 10:47, 128F

01/26 10:48, 2年前 , 129F
ar(44476,1,0)~ar(45000,1,0) 可以拿來記錄資料數量
01/26 10:48, 129F

01/26 10:49, 2年前 , 130F
每個ar(x,1,0) 都能拿來放數量紀錄
01/26 10:49, 130F

01/26 10:49, 2年前 , 131F
不過要有檔案比較好做
01/26 10:49, 131F

01/26 10:50, 2年前 , 132F
通常會用到字典嵌套 也代表這是一個需要多次比對資料的
01/26 10:50, 132F

01/26 10:50, 2年前 , 133F
問題類型 以一般的二維陣列 就會綁手綁腳 因為感覺要
01/26 10:50, 133F

01/26 10:51, 2年前 , 134F
創很多個陣列 但是用上多維陣列 跟0位記錄數量的方法
01/26 10:51, 134F

01/26 10:51, 2年前 , 135F
就能達到相同效果
01/26 10:51, 135F

01/26 10:51, 2年前 , 136F
倘若問題更為複雜 比如第一維非日期 該如何處理
01/26 10:51, 136F

01/26 10:52, 2年前 , 137F
當然用字典嵌套是個好方法
01/26 10:52, 137F

01/26 10:52, 2年前 , 138F
但如果資料量高過10000以上 會連字典都變慢卡住
01/26 10:52, 138F

01/26 10:52, 2年前 , 139F
這時候用陣列速度會更快
01/26 10:52, 139F

01/26 10:53, 2年前 , 140F
但難度又會多一道手續 必須將文字 用asc轉成數字
01/26 10:53, 140F

01/26 10:53, 2年前 , 141F
利用隨機兩個字轉asc的尾數 來當作一維陣列號數0~99
01/26 10:53, 141F

01/26 10:53, 2年前 , 142F
那就可以處理更大範圍的資料比對
01/26 10:53, 142F

01/26 10:54, 2年前 , 143F
但如果再上去達到30萬筆時 就建議改學SQL
01/26 10:54, 143F

01/26 10:54, 2年前 , 144F
其實5萬筆資料以上 就建議改用SQL處理了
01/26 10:54, 144F

01/27 09:53, 2年前 , 145F
驚!沒想到w大持續光臨XD。
01/27 09:53, 145F

01/27 09:56, 2年前 , 146F
當時有想到移除重複項後再寫入陣列,一樣可達到去重效
01/27 09:56, 146F

01/27 09:56, 2年前 , 147F
果,但考量到在陣列取出多重條件比對後的結果有點難(
01/27 09:56, 147F

01/27 09:56, 2年前 , 148F
可能有其他我不知道的解法),所以就採用多層字典。
01/27 09:56, 148F
文章代碼(AID): #1Xx0wOx3 (Office)