ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[讨论] 两种引用字典方式为什么会存在功能差异?

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2013-11-22 14:30 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖已被收录到知识树中,索引项:数组集合和字典
本帖最后由 chxw68 于 2013-11-22 15:03 编辑

大家知道引用字典存在两种方式:即前期绑定和后期绑定,但两种方式在功能上存在微小差异,利用前期绑定的方法,在程序中可以像使用数组一样,用d.keys(i)或者d.itmes(i)方法引用关键字或者项目,但在后期绑定中这样使用就会产生错误,大家知道是什么原因吗?
Sub test()
  'Dim d As New Dictionary
  Dim d As Object
  Set d = CreateObject("scripting.dictionary")
  Dim i As Integer
  For i = 1 To 10
    d(i) = i
  Next
  MsgBox d.Keys(1)
   
End Sub

点评

知识树索引:六楼  发表于 2015-5-31 11:11

TA的精华主题

TA的得分主题

发表于 2013-11-22 14:44 | 显示全部楼层
其实也是可以的
  1. Sub test()
  2.   'Dim d As New Dictionary
  3.    Dim d As Object, k
  4.    Set d = CreateObject("scripting.dictionary")
  5.   Dim i As Integer
  6.   For i = 1 To 10
  7.     d(i) = i
  8.   Next
  9.   k = d.Keys
  10.   MsgBox k(1)
  11. End Sub
复制代码

点评

呵呵,你这是投机取巧,偷换概念……  发表于 2013-11-22 14:49

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-11-22 15:05 | 显示全部楼层
gufengaoyue 发表于 2013-11-22 14:44
其实也是可以的

将关键字和项目字转换成数组在两种绑定方式下都能使用,就是d.keys(i)和d.items(i)在后期绑定中不能使用。

TA的精华主题

TA的得分主题

发表于 2013-11-22 15:10 | 显示全部楼层
前期绑定以后,字典New Dictionary 就是一个既存的字典对象类型,所有的功能都能得到充分使用……

如果是后期绑定,那么字典只是一个客户创建对象,不能作为既存对象而直接引用。
只能作为一个外部引用的功能,而为了整体效率,某些功能并不能被直接利用。

………………
其实后期绑定也可以达到同样的效果:

先把dic.Keys 和 dic.Items 内容读出为数组,然后就可以直接引用了。

如:
  1. Sub test()
  2. '    Dim dic As New dictionary
  3.    
  4.     Set dic = CreateObject("Scripting.Dictionary")
  5.     dic("a") = ""
  6.     dic("b") = ""
  7.    
  8.     krr = dic.Keys
  9.     trr = dic.Items
  10.    
  11.     MsgBox krr(0)
  12.     MsgBox trr(0)
  13.    
  14. End Sub
复制代码
大致这么来认识就可以了吧。

点评

高人呐~!  发表于 2013-11-22 15:50

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2013-11-22 15:22 | 显示全部楼层
晓得反正不能那么用就是了嘛{:soso_e120:}
具体原因问小比同学吧{:soso_e112:}

TA的精华主题

TA的得分主题

发表于 2013-11-22 16:19 | 显示全部楼层
是vba在缺少类型信息时语法解析上的一些问题。
从错误信息上来看,在缺少类型信息时,VBA似乎是把dict.Keys(1)解析成了调用一个接受索引的属性。而实际上呢,Dictionary的Keys不接受索引,也根本不是属性,所以会引发一个找不到属性的错误。
那么Dictionary.Keys到底是什么呢,它是一个返回变体(当然我们知道实际类型是数组)的函数。知道了这一点,我们就能够写出不让VBA“误解”的代码——通过加上函数调用时使用的括号来“提醒”VBA这是一个函数:
  1. Public Sub 无歧义调用Keys函数()
  2.     Dim dict As Object
  3.     Set dict = CreateObject("scripting.dictionary")
  4.     dict("a") = 3
  5.     MsgBox dict.keys()(0)
  6. End Sub
复制代码
至于使用前期绑定的情况,由于VBA知道Keys是一个函数,所以能够正确处理。

点评

原则上,不建议这么使用字典,因为操作字典的代码很多时候是循环使用的,这种函数+数组的操作会降低程序效率。不过,作为知识点,会员还是可以了解和掌握的。  发表于 2015-5-31 13:02

评分

12

查看全部评分

TA的精华主题

TA的得分主题

发表于 2013-11-22 16:24 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
香川群子 发表于 2013-11-22 15:10
前期绑定以后,字典New Dictionary 就是一个既存的字典对象类型,所有的功能都能得到充分使用……

如果是 ...

求问:
从唯心主义讲,存在即合理。后期绑定的优势,有什么好处么?
后期绑定,功能上又少,从输入字符上来讲,也更多。

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-11-22 16:26 | 显示全部楼层
PLINQ 发表于 2013-11-22 16:19
是vba在缺少类型信息时语法解析上的一些问题。
从错误信息上来看,在缺少类型信息时,VBA似乎是把dict.Key ...

正解!解决了长期困绕我的一个问题!相信很多使用过字典的人都会遇到这个问题。

TA的精华主题

TA的得分主题

发表于 2013-11-22 16:26 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
cleverzhzhf 发表于 2013-11-22 16:24
求问:
从唯心主义讲,存在即合理。后期绑定的优势,有什么好处么?
后期绑定,功能上又少,从输入字符 ...

后期通用性更强,除非你电脑里没有,要不一定能用

前期通用性差,不管你有没有,只要你不引用,啥都不管用

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2013-11-22 17:11 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
据说某些高手的经验是:

1. 自己用的代码就前期绑定、给别人写代码就一定要用后期绑定(确保代码通用性)

2. 为了方便,编程写代码调试时先用前期绑定,
  代码调试完成以后,再进行后期绑定以及相关处理。
…………前提是,dic.keys(1) 只是调试时需要用到的语句。
  否则,这么做会更加麻烦。呵呵。



顺便说 Msgbox dic.keys()(0) 这种用法,
和 krr = dic.keys : Msgbox krr(0) 本质上可以说是一回事了。

但如果真的需要反复调用时,那么先进行 krr = dic.keys 的处理效率高。

评分

1

查看全部评分

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

本版积分规则

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

GMT+8, 2024-3-29 04:09 , Processed in 0.048634 second(s), 10 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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