Office 板


LINE

(若是和其他不同软体互动之问题 请记得一并填写) 软体: 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://webptt.com/cn.aspx?n=bbs/Office/M.1642860184.A.EC3.html
1F:推 waiter337: 我教你去破 01/23 00:19
2F:→ waiter337: 你找空白处 输入'dic.keys() 跟 'dic.items() 01/23 00:20
3F:→ waiter337: 新增监看视 01/23 00:20
4F:→ waiter337: 前面的'不要选到 然後各新增一个监看式 你就看懂了 01/23 00:21
5F:→ waiter337: 另外 我不知道你的问题 brr并不是字典 是阵列 01/23 00:22
6F:推 waiter337: 上面的dic.keys() 跟dic.items()是第一层 01/23 00:27
7F:→ waiter337: 忘了说 要查看都得在程式运行时设中断点才有资料 01/23 00:27
8F:→ waiter337: 而第二层就得要看你第一层的资料代入才有办法看的到 01/23 00:28
9F:→ waiter337: dic是物件 不像阵列会有第二层自动显示 01/23 00:29
10F:→ waiter337: 我做个图好了 01/23 00:30
11F:→ kumasan123: http://i.imgur.com/2Rt3exY.jpg 01/23 00:54
12F:→ kumasan123: w大您好,我试您的方法,有办法知道第三层吗? 01/23 00:55
13F:→ kumasan123: http://i.imgur.com/dPif8GQ.jpg 01/23 00:55
14F:→ waiter337: https://i.imgur.com/wcp5r2W.png 01/23 00:59
15F:→ waiter337: 会第一第二层 就会第三层 01/23 01:00
16F:→ waiter337: 看你是要用"文字" 还是dic.keys()(0)(0) 01/23 01:00
17F:→ waiter337: dic("文字")("文字")("文字") 01/23 01:01
18F:→ waiter337: 当然你也可以直接用变数 'dic(SerDate) 01/23 01:03
19F:→ waiter337: 或者'dic(SerDate)(Names) 但上述这两种 都只会出现 01/23 01:03
20F:→ waiter337: 一下就消失 会跟着变数变化 01/23 01:04
21F:→ waiter337: 这里偏难 要花几个小时玩玩看 01/23 01:07
22F:→ waiter337: 我更正一下 你的两张图 都只有在第一层 01/23 01:08
23F:→ waiter337: 我大概打一些 你试看看 01/23 01:09
24F:→ waiter337: 'dic.keys()(0)(0) 01/23 01:09
25F:→ waiter337: dic(#2021/10/7#) 01/23 01:09
26F:→ waiter337: 'dic.keys()(0)(0)(0) 01/23 01:11
27F:→ waiter337: 怕你观念有问题 我补充一下 01/23 01:11
28F:→ kumasan123: 没错,的确是一开始新增监看,会直接就地建立该字典。 01/23 01:12
29F:→ waiter337: 每一层 都有key 跟 item 01/23 01:12
30F:→ waiter337: 而keys() 跟items() 是"总集合" 01/23 01:13
31F:→ kumasan123: 好的,我早上会试试,非常不好意思晚上还让您解说。再 01/23 01:14
32F:→ kumasan123: 次感谢。 01/23 01:14
33F:推 waiter337: 该层的总集合 01/23 01:15
34F:→ waiter337: 我的讲解内也有一些小错误 用自己的直觉去玩学比较快 01/23 01:21
35F:→ waiter337: 'dic.items()(0)(0) 01/23 04:22
36F:→ kumasan123: http://i.imgur.com/yBXMTl2.jpg 01/23 12:50
37F:→ kumasan123: 我试着用Dic()(0)(0)也是看不到第三层水果,要怎麽监 01/23 12:53
38F:→ kumasan123: 看到水果或输出到Excel储存格(如Names) 表达方式? 01/23 12:53
39F:→ waiter337: 都要试试看阿 01/23 17:34
40F:→ waiter337: dic.keys()(0) 01/23 17:34
41F:→ waiter337: dic.keys()(0)(0) 01/23 17:35
42F:→ waiter337: dic.keys()(0)(0)(0) 01/23 17:35
43F:→ waiter337: dic.items()(0) 01/23 17:35
44F:→ waiter337: dic.items()(0)(0) 01/23 17:35
45F:→ waiter337: dic.items()(0)(0)(0) 01/23 17:35
46F:→ waiter337: dic(#2021/10/7#)("james") 01/23 17:37
47F:→ waiter337: 就是玩 要玩出规律 01/23 17:38
48F:→ kumasan123: 谢谢w大的引导,有抓住一些线索了。 01/23 22:57
49F:→ waiter337: 你想要监看的话... 01/24 09:12
50F:→ waiter337: names 是在第二层 01/24 09:13
51F:→ waiter337: 通常作法如你一开始提供的范例 01/24 09:29
52F:→ waiter337: 会先将字典筛好去重的资料 依照顺序转放入brr阵列里面 01/24 09:30
53F:→ waiter337: 然後再去找brr 的第二栏 跑回圈 01/24 09:30
54F:→ waiter337: 不过 此种方式有多种操作 可以选择自己需要的方向 01/24 09:31
55F:→ waiter337: 比如依照原本范例 他是导出dic.keys() 01/24 09:32
56F:→ waiter337: 也可以用回圈导出其他东西 如dic.items() 01/24 09:33
57F:→ waiter337: 就要看你的需求 01/24 09:33
58F:→ waiter337: 他的brr(jloop,3) ="" 这行确实没任何用途 01/24 09:33
59F:→ waiter337: 可能是原先准备要拿来预备用的 01/24 09:33
60F:→ waiter337: 当然你也可以利用回圈 for i = 1 to dic.count 01/24 09:39
61F:→ waiter337: 上述更正 01/24 09:41
62F:→ waiter337: for i = 0 to dic.count 01/24 09:42
63F:→ waiter337: 然後搭配 dic.items()(i).count 去跑 多层回圈 01/24 09:46
64F:→ waiter337: 不过还有一种方法也可以 比较常见 01/24 09:46
65F:→ waiter337: 这种方法通常运用在爬虫或者网页上 01/24 09:46
66F:推 waiter337: 用for each d0 in dic 先遍例第一层 01/24 09:48
67F:→ waiter337: 遍历 01/24 09:49
68F:→ waiter337: 然後 第二层 再用 for each d1 in d0 再跑一圈 01/24 09:49
69F:→ waiter337: 接着判断d1 是否有东西 01/24 09:50
70F:→ kumasan123: w大真热心。我原本用意两份资料(A与B资料)先比对, 01/24 20:00
71F:→ kumasan123: 先将B资料写入字典内,再以A资料检验,若存在则进行後 01/24 20:00
72F:→ kumasan123: 续资料处理。 01/24 20:00
73F:→ kumasan123: 试过几个方式,如您上述提到的For Each也试过。後来遇 01/24 20:07
74F:→ kumasan123: 到问题想排除,想使用监看方式观察,发现第三层第四层 01/24 20:07
75F:→ kumasan123: 的监看设定不出来,例如Dic() (0)(0).keys还是不行( 01/24 20:07
76F:→ kumasan123: 惭愧)。所以改用字典写入Brr,再转写至储存格,第三 01/24 20:07
77F:→ kumasan123: 层也就卡住了。 01/24 20:07
78F:→ kumasan123: 後来A资料比对就用Exists比对,遇到另一个问题此处需 01/24 20:09
79F:→ kumasan123: 要物件(阶段错误424),现在也在排除中。 01/24 20:09
80F:→ waiter337: 要查key 要用items()(0)(0)(0) 01/24 20:10
81F:→ waiter337: 要查item 要用dic.keys()(0)(0)(0) 数字可以自己调整 01/24 20:10
82F:→ waiter337: 因为不一定每个都有三层 01/24 20:10
83F:→ waiter337: 更正 要查key 要用dic.items()(0)(0)(0) 01/24 20:12
84F:→ waiter337: dic.items()(0)(0)(0).......看几层 用几层 01/24 20:13
85F:→ waiter337: 另外提供一个情报 dic虽然在vba使用上能用自动去重 01/24 20:13
86F:→ kumasan123: 是的,经由提示,才知道是在item内 XD。 01/24 20:14
87F:→ waiter337: 但实际上的字典 无法自动去重 若你未来有用到其他语言 01/24 20:14
88F:→ waiter337: 就需要靠exist确认是否存在才能放入 以免会bug 01/24 20:14
89F:→ waiter337: 但vba不影响 01/24 20:14
90F:→ kumasan123: 咦,是透过exist来去重吗?我之前想重复给予同一个key 01/24 20:18
91F:→ kumasan123: ,可能会盖掉原本的item值但是不会新增key值。 01/24 20:18
92F:→ waiter337: 补充 并不是在item内 01/24 20:18
93F:→ waiter337: vba 本身有自动去重的功能 但其他语言没有例如vb.net 01/24 20:19
94F:→ waiter337: 而是key 跟 item 本身就是相互存在的 01/24 20:20
95F:→ waiter337: 比如 你 跟 身分证字号 01/24 20:21
96F:→ waiter337: 假如 我指"你" 那麽代表 我要的是身分证字号 01/24 20:21
97F:→ waiter337: 反之 我给了身分证字号 那麽 我要的是"你" 01/24 20:22
98F:→ waiter337: 比如 张三 a123456789 01/24 20:22
99F:→ waiter337: 那麽 我查张三 我要的答案就是a123456789 01/24 20:22
100F:→ waiter337: 而我查a123456789 而该给我的答案就是 张三 01/24 20:23
101F:→ waiter337: 若复杂一点 a123456789 可以不只是文字 还可以是物件 01/24 20:24
102F:→ waiter337: 才会出现这种层层叠加的状态 01/24 20:24
103F:→ waiter337: 也就是说 如范例 你可能创了几百个字典 只不过字典包 01/24 20:25
104F:→ waiter337: 着其他的字典 01/24 20:25
105F:→ waiter337: 虽然看起来只有dic 一本字典 但里面还有上百个字典 01/24 20:25
106F:→ waiter337: 比如dic(#2021/1/7#) <--这里面可能又藏了一本字典 01/24 20:26
107F:→ kumasan123: 谢谢热心回答及举例说明。 01/24 20:26
108F:→ kumasan123: 嗯嗯,多层字典,我看左岸论坛另一个说法字典嵌套。都 01/24 20:30
109F:→ kumasan123: 是表达同样意思。 01/24 20:30
110F:→ waiter337: 是的 01/24 20:33
111F:→ waiter337: 如果不要去重 就用阵列会更方便点= = 因为我观察这题 01/26 10:41
112F:→ waiter337: 其实用阵列应该会更适合 01/26 10:41
113F:→ waiter337: 比如你的第一个是2021/1/7 01/26 10:42
114F:→ waiter337: 更正2021/10/7号 01/26 10:42
115F:→ waiter337: 你可能会怀疑 阵列该怎麽做会适合 01/26 10:42
116F:→ waiter337: 其实 日期非常适合用阵列 01/26 10:43
117F:→ waiter337: 因为2021/10/7 的通用格式数字 就是44476 01/26 10:43
118F:→ waiter337: 那接着下一个问题就是 我要怎麽创阵列 01/26 10:43
119F:→ waiter337: 阵列的创造有个特性 不一定要从0开始创 01/26 10:43
120F:→ waiter337: 甚至vba 还可以从负的开始创 这目前不在讨论范围 01/26 10:44
121F:→ waiter337: 也就是我们 可以这样创 01/26 10:44
122F:→ waiter337: redim ar(44476 to 50000,20,20) 01/26 10:45
123F:→ waiter337: 至少每个日期能放20人 每个人 还能放20种水果 01/26 10:45
124F:→ waiter337: 而且还不会卡住 01/26 10:46
125F:→ waiter337: 这题目刚好是多维阵列 目前是3维 01/26 10:46
126F:→ waiter337: 接着下个问题就是 每个日期内的资料 数量都不同怎麽办 01/26 10:46
127F:→ waiter337: 由於我们创的阵列第3维是从0~20 01/26 10:47
128F:→ waiter337: 也就是资料从1~20放入就好 01/26 10:47
129F:→ waiter337: ar(44476,1,0)~ar(45000,1,0) 可以拿来记录资料数量 01/26 10:48
130F:→ waiter337: 每个ar(x,1,0) 都能拿来放数量纪录 01/26 10:49
131F:→ waiter337: 不过要有档案比较好做 01/26 10:49
132F:→ waiter337: 通常会用到字典嵌套 也代表这是一个需要多次比对资料的 01/26 10:50
133F:→ waiter337: 问题类型 以一般的二维阵列 就会绑手绑脚 因为感觉要 01/26 10:50
134F:→ waiter337: 创很多个阵列 但是用上多维阵列 跟0位记录数量的方法 01/26 10:51
135F:→ waiter337: 就能达到相同效果 01/26 10:51
136F:→ waiter337: 倘若问题更为复杂 比如第一维非日期 该如何处理 01/26 10:51
137F:→ waiter337: 当然用字典嵌套是个好方法 01/26 10:52
138F:→ waiter337: 但如果资料量高过10000以上 会连字典都变慢卡住 01/26 10:52
139F:→ waiter337: 这时候用阵列速度会更快 01/26 10:52
140F:→ waiter337: 但难度又会多一道手续 必须将文字 用asc转成数字 01/26 10:53
141F:→ waiter337: 利用随机两个字转asc的尾数 来当作一维阵列号数0~99 01/26 10:53
142F:→ waiter337: 那就可以处理更大范围的资料比对 01/26 10:53
143F:→ waiter337: 但如果再上去达到30万笔时 就建议改学SQL 01/26 10:54
144F:→ waiter337: 其实5万笔资料以上 就建议改用SQL处理了 01/26 10:54
145F:→ kumasan123: 惊!没想到w大持续光临XD。 01/27 09:53
146F:→ kumasan123: 当时有想到移除重复项後再写入阵列,一样可达到去重效 01/27 09:56
147F:→ kumasan123: 果,但考量到在阵列取出多重条件比对後的结果有点难( 01/27 09:56
148F:→ kumasan123: 可能有其他我不知道的解法),所以就采用多层字典。 01/27 09:56







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:BabyMother站内搜寻

TOP