[问题] 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