ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
12
返回列表 发新帖
楼主: Si疯子

[求助] 关于字典嵌套数组存储数据的问题

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-1-22 11:11 | 显示全部楼层
Sub test2()
    Dim d, A, x
    A = [{4,5;6,7}]
    Set d = CreateObject("scripting.dictionary")
    '    d(8, 9) = 100
    d(1) = A
    MsgBox d(1)(2, 2)    '返回7
End Sub



字典应该只关心 key 和 item 的事,
至于 item 自己的事,字典(啥都可以塞)关心不过来,也不该去关心。
想了个不恰当比喻:
警察可以帮忙找家长找孩子,但(家长的)孩子吃喝拉撒睡。。。警察就不是负责的事了


dic(1)(i, j) = i + j
又看了下字典的 Item 属性帮助,太少了,没找到对此的有用说明
我不知道为什么不报错,但能肯定的是,这不是设置key(如果是,就像test2注释那句,会报错),所以不是字典中的行为
我瞎猜:这就像在修改一个匿名对象的引用(但在VBA中数组的数据类型不是对象),
因为是匿名(没给值事先指定变量)的,所以赋值了也看不到在哪儿,
会不会要借助一些内存地址的方法,来看赋值的值去哪儿了,那些我不懂。。。。


TA的精华主题

TA的得分主题

发表于 2019-1-22 11:44 | 显示全部楼层
看了10楼老师的代码,清晰明了,对字典的用法又理解多了一点

TA的精华主题

TA的得分主题

发表于 2019-1-22 12:45 | 显示全部楼层
microyip 发表于 2019-1-22 10:39
字典嵌套,仅供参考

http://club.excelhome.net/thread-1458153-1-1.html

这个帖子,能不能用字典嵌套来完成呢?结果每列的第一行为第一层字典,对应的其它行为对应列首行的第二层字典??

TA的精华主题

TA的得分主题

发表于 2019-1-22 12:49 | 显示全部楼层
本帖最后由 aman1516 于 2019-1-22 12:51 编辑

也来个“想当然是这样”的思维:
dic(1)(i, j)  是 ”字典的 Item” 的 “值”
你把  ”字典的 Item” = i + j 来重新赋值
再看下 字典的用法, 以及对 字典的 Item  重新赋值 的方法
或许,就知道为什么会出错了
或许,我上面的理解也错了

TA的精华主题

TA的得分主题

发表于 2019-1-22 13:16 | 显示全部楼层
本帖最后由 microyip 于 2019-1-22 13:17 编辑

你可以换种思维方式,就能实现你想做的事
  1. Sub cc()
  2.     Dim nI As Integer, nJ As Integer
  3.     Dim oDic As Object
  4.    
  5.     Set oDic = CreateObject("Scripting.Dictionary")
  6.     For nI = 1 To 3
  7.         Set oDic(nI) = CreateObject("Scripting.Dictionary")
  8.     Next i
  9.    
  10.     For nI = 1 To 5
  11.         For nJ = 1 To 3
  12.             oDic(1)(nI & "|" & nJ) = nI + nJ
  13.         Next nJ
  14.     Next nI

  15.     MsgBox oDic(1)(2 & "|" & 1)
  16. End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-1-22 14:18 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
microyip 发表于 2019-1-22 10:39
字典嵌套,仅供参考

谢谢,搞明白了!

TA的精华主题

TA的得分主题

发表于 2019-1-22 15:52 | 显示全部楼层
Si疯子 发表于 2019-1-22 10:13
这一段代码,就是把字典嵌套了一个数组啊,dic(1)就相当于arr了,dic(1)(1,1)就相当于arr(1,1)

你这个操作,字典建立了 1、2、3这3个key,
他们各自对应的Item都是一个arr(1 To 5,1 To 3)的数组以及这个空白数组的空白内容。

但是,接下来你对这个字典中1、2、3这3个key的任何操作,都只能提取这个空白数组中的空白内容,
无法对这个字典中的空白数组进行新内容的赋值。

也就是说,字典只能对key对应的Item内容进行整体操作(读取、置换或删除)
而不能对Item内容进行更细分的操作(只对其中的一部分进行操作)

虽然你写出了 dic(1)(i, j) = i + j 的语句,但是没有任何实际意义。(无法进入实际操作)

而 tmp=dic(1)(i, j) 这样读取内容的操作,是可以的。(只不过读取的结果也只是空白。)

…………
总之,数组中嵌套数组是可以任意读、写的,
而字典只有嵌套字典才能继续操作,字典中的Item如果不是字典而是数组结构,那就只能被读取,不能被重写


TA的精华主题

TA的得分主题

发表于 2019-1-22 15:52 | 显示全部楼层
本帖最后由 香川群子 于 2019-1-22 15:56 编辑
Si疯子 发表于 2019-1-22 10:13
这一段代码,就是把字典嵌套了一个数组啊,dic(1)就相当于arr了,dic(1)(1,1)就相当于arr(1,1)

你这个操作,字典建立了 1、2、3这3个key,
他们各自对应的Item都是一个arr(1 To 5,1 To 3)的数组以及这个空白数组的空白内容。

但是,接下来你对这个字典中1、2、3这3个key的任何操作,都只能提取这个空白数组中的空白内容,
无法对这个字典中的空白数组进行新内容的赋值。

也就是说,字典只能对key对应的Item内容进行整体操作(读取、置换或删除)
而不能对Item内容进行更细分的操作(只对其中的一部分进行操作)

虽然你写出了 dic(1)(i, j) = i + j 的语句,但是没有任何实际意义。(无法进入实际操作)

而 tmp=dic(1)(i, j) 这样读取内容的操作,是可以的。(只不过读取的结果也只是空白。)

…………
总之,数组中嵌套数组是可以任意读、写的,
而字典只有嵌套字典才能继续操作,字典中的Item如果不是字典而是数组结构,那就只能被读取,不能被重写

…………背后的原因是:
字典这是通过哈希算法,对关键字key和key指向的内容建立了一个快速Index的数组索引,不能通过这个数组索引改变索引指向的实际内容。

评分

1

查看全部评分

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

本版积分规则

关闭

最新热点上一条 /1 下一条

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-26 09:10 , Processed in 0.044663 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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