Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 4915|回复: 15

[已解决]有关字典和数组结合后修改数组的疑问

[复制链接]
发表于 2010-2-25 10:06 | 显示全部楼层 |阅读模式

请看代码:

Sub test()
Dim Dic As Object
Set Dic = CreateObject("scripting.dictionary")
Dic.Add "Key1", Array(1, False) '将数组作为item加入字典
MsgBox Dic("Key1")(1) '显示该key下的item,即数组的第二项的值false
Dic("Key1")(1) = True '妄图改变该数组的第二项值为true,程序不报错,但是不成功
MsgBox Dic("Key1")(1) '仍旧显示false值
Dic("Key1") = Array(1, True) '一定要这样改变才正确,不知为什么
MsgBox Dic("Key1")(1) '这回显示修改值成功了。
End Sub

最佳答案
2010-2-25 12:21

针对Dic("Key1")(1) = True打个比方:

你是一位作家,出了1本书,书名叫key1,嘿嘿,书只有2页,第1页写着1,第2页写着false。

当你的书出版后,你发现第2页的内容需要修改为True,于是你跑到出版社,要求修改。

 

 

小富康:我的第2页应该是true,而之前出版的fasle呀!

出版社拿来一看(比较),果然不一样(msgbox Dic("Key1")(1) = True,返回fasle,fasle相当于不一样)

小富康:你看对吧,和之前出版不一样呀!

出版社:没错(但没有任何行动)

小富康:我要修改书名为key1,第2页内容要改为true

出版社:只能将你书的全部内容修改以后,重新出版。出版社不是你的个人编辑部啊。

小富康:.....[em03]

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2010-2-25 10:32 | 显示全部楼层

帮助说: .... 每个条目都与一个唯一的关键字相关联.....

帮助: .....在改变某个 item 时,没有找到 key,则用指定的newitem创建一个新的 key 。.....

在Dic("Key1")(1) = True执行后,我猜字典试图创建一个key(key值为Key1(1)),但字典的key是除数组外的任何类型,所以无法创建。只能看作判断表达式。Dic("Key1")(1)不是唯一的关键字,也无法被赋值。

回复

使用道具 举报

发表于 2010-2-25 10:34 | 显示全部楼层

我只是比较帮助后,感觉你这样的操作不应被实现,但说不出为什么[em04]

回复

使用道具 举报

 楼主| 发表于 2010-2-25 11:57 | 显示全部楼层

爱疯,我还是不能理解的。
回复

使用道具 举报

发表于 2010-2-25 12:21 | 显示全部楼层    本楼为最佳答案   

针对Dic("Key1")(1) = True打个比方:

你是一位作家,出了1本书,书名叫key1,嘿嘿,书只有2页,第1页写着1,第2页写着false。

当你的书出版后,你发现第2页的内容需要修改为True,于是你跑到出版社,要求修改。

 

 

小富康:我的第2页应该是true,而之前出版的fasle呀!

出版社拿来一看(比较),果然不一样(msgbox Dic("Key1")(1) = True,返回fasle,fasle相当于不一样)

小富康:你看对吧,和之前出版不一样呀!

出版社:没错(但没有任何行动)

小富康:我要修改书名为key1,第2页内容要改为true

出版社:只能将你书的全部内容修改以后,重新出版。出版社不是你的个人编辑部啊。

小富康:.....[em03]

回复

使用道具 举报

 楼主| 发表于 2010-2-25 12:51 | 显示全部楼层

爱疯会玩花样啊。搞了个出版社出来。

这个东东,找不到答案,只能通过实践得出这样的结论了:可以读取字典中的数组单个元素的值。但是向字典写入数组的时候,不论是初次还是后来修改,必须是整体写入,不能局部改变。这个VB,应该提示一下错误嘛,弄得不伦不类的。

回复

使用道具 举报

发表于 2010-2-25 13:09 | 显示全部楼层

我只是临时翻帮助,由于没发现更多有价值的对字典数组部分的说明,所以只能靠现有的去比喻。

至于为什么不提示,我想我只有去相信这句仅有关的帮助:字典的key是除数组外的任何类型

回复

使用道具 举报

发表于 2010-2-25 17:41 | 显示全部楼层

因为数值传递方式的问题吧。
回复

使用道具 举报

 楼主| 发表于 2010-2-25 20:03 | 显示全部楼层

阿童木说的可能有点道理,具体程序编译以后内部是怎么运行的,现在只能是猜测了
回复

使用道具 举报

发表于 2010-2-25 20:25 | 显示全部楼层

因为无论是d(key)=a或者d.add key,a在字典的定义中已经定义了这两种方法。所以能够赋值。
当用d(key)的时候调用的是Item属性,Get和Let的设置应该都和d直接关系,而和其中存储的数据无关。所以在调用的时候只是一个临时的变量,赋值后并没有在真正的地址改变值。

看一下附件里面的例子吧 LMfDDiuC.rar (7.05 KB, 下载次数: 5)

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-19 12:46 , Processed in 0.326645 second(s), 10 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表