ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

请教下有关dictionary添加range数据的问题

[复制链接]

TA的精华主题

TA的得分主题

发表于 2014-10-28 10:51 | 显示全部楼层 |阅读模式
请教下创建一个dictionary对象后,如果添加的数据是range数据,那么,key不能重复的功能好像就无法发挥作用了,而如果把这个范围赋值给一个变量,再把这个变量添加到dictionary中,则key的不能重复则发挥作用了,这是什么原因?烦请赐教,谢谢!
捕获.JPG
  1. Sub test()
  2. With CreateObject("scripting.dictionary")
  3. For Each it In Range("A1:A10")
  4.     .Item(it) = it & "_content"
  5. Next
  6. Debug.Print .Count      '输出为10,key值重复了
  7. End With
  8. End Sub


  9. Sub test2()
  10. Dim sn
  11. With CreateObject("scripting.dictionary")
  12. sn = Range("A1:A10")
  13. For Each it In sn
  14.     .Item(it) = it & "_content"
  15. Next
  16. Debug.Print .Count              '输出为6,key值不重复
  17. End With
  18. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2014-10-28 11:05 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
it.value 试试

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-10-28 11:15 | 显示全部楼层
zheng_0925 发表于 2014-10-28 11:05
it.value 试试

使用it.value后是可以,能否解释下其中的缘由?key也没有要求一定是要字符串,数值、日期等类型也可以呀?谢谢!

TA的精华主题

TA的得分主题

发表于 2014-10-28 11:24 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
Range 是一个单元格对象,所以当for each 在一个单元格区域中循环,并把任一对象作为key 赋给字典的时候,每个单元格对象都是不同的。
注意:单元格对象不等于单元格对象的值,值只是该对象的一项属性而已。比如该对象还有address 属性,当然每个都不同。
For Each it In Range("A1:A10")

   .Item(it.value) = it.value & "_content"

Next

做上面修改再试试看吧

TA的精华主题

TA的得分主题

发表于 2014-10-28 11:27 | 显示全部楼层
ccvvccvv 发表于 2014-10-28 11:15
使用it.value后是可以,能否解释下其中的缘由?key也没有要求一定是要字符串,数值、日期等类型也可以呀? ...

字典的key 是可以是对象的。但是你for each 中每一个对象其实都是不同的,原因在我上面的帖子说了。

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-10-28 11:28 | 显示全部楼层
hehex 发表于 2014-10-28 11:24
Range 是一个单元格对象,所以当for each 在一个单元格区域中循环,并把任一对象作为key 赋给字典的时候,每 ...

终于明白了单元格对象与单元格对象值的区别了,学习了,非常感谢!

点评

开始用字典的时候也遇到过类似问题的。。。。  发表于 2014-10-28 11:54

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-10-28 12:16 | 显示全部楼层
hehex 发表于 2014-10-28 11:27
字典的key 是可以是对象的。但是你for each 中每一个对象其实都是不同的,原因在我上面的帖子说了。

接着上面的例子,如果还是用.item(it)=添加数据的话,那最终添加进入dictionary的key不是就重复了,按理论上说,dictionary中的key应该是不能重复的吗?这又该如何解释这一现象?谢谢!不吝赐教!
  1. Sub test()
  2. With CreateObject("scripting.dictionary")
  3. For Each it In Range("A1:A10")
  4.     .Item(it) = it & "_content"
  5. Next
  6. Debug.Print .Count      '输出为10,key值重复了
  7. Cells(1, 2).Resize(.Count) = Application.Transpose(.keys)
  8. Cells(1, 3).Resize(.Count) = Application.Transpose(.items)
  9. End With
  10. End Sub
复制代码
捕获-2.JPG

TA的精华主题

TA的得分主题

发表于 2014-10-28 12:59 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
ccvvccvv 发表于 2014-10-28 12:16
接着上面的例子,如果还是用.item(it)=添加数据的话,那最终添加进入dictionary的key不是就重复了,按理论 ...

当然没有重复。
.item(it) 是指以it 为字典的key 所对应的item, 那么it 是什么,it 是Range("A1:A10") 中遍历循环的一个对象,换句话说,it 是一个单元格对象而不是一个值,作为单元格对象A1,A2... A10 每一个都是唯一的,无论它的值是否重复。
还是那句话,要把单元格对象和对象的值分割开来,比如Range("A1") 是一个单元格对象,但是由于VBA 的设定,Range("A1") 也可以代表A1 单元格的值即Range("A1").Value,具体情况是由语法器来分析。
比如
dim s as string
s= range("a1") '很明显是A1 的值
再比如
dim a
set a= range("a1") '很明显是对象

当你把对象装入字典,这问题复杂了。字典这个容器本身是可以把对象装进来做key 或者item 的,因此当你把一个Range 装进来的时候,语法器优先认为你装进来一个单元格对象,而不是它的值。前面说的很清楚了,每个单元格对象都是不同的,因此key 没有重复。

估计你的问题是出在输出部分,即
Cells(1, 2).Resize(d.Count) = Application.Transpose(d.keys)
不是说key 是不能重复的吗?为什么输出的值有重复呢?
要知道key 是单元格对象,单元格对象是无法直接这么输出的,你输出的是什么?如果是其他强类型的语言
这里直接就报错了。而VBA 的一大优点(或说缺点)就是会自行脑补,这个错了,它猜一下。单元格对象不能输出啊,哦是要输出该单元格对象的值属性,因为值属性是默认属性通常可以省略.value 的。于是就输出了该对象的值属性。
人家字典保证的是你的key 就是那些单元格对象每一个都是不同的,不保证你的key 的值不出现重复。
这么讲如果还不明白,俺也就没辙了。
还有初学字典时尽量少用 With CreateObject("xxxxx") End With语句。
好多东西如果有变量名,调试时到本地窗口一看就明白了,没变量名则无法追踪调试。

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-10-28 14:16 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
hehex 发表于 2014-10-28 12:59
当然没有重复。
.item(it) 是指以it 为字典的key 所对应的item, 那么it 是什么,it 是Range("A1:A10") 中 ...

非常感谢,明白了,问题出在我一直对输出部分的单元格对象与单元格对象的值没充分理解,现在明白了,再次谢谢!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-1-11 07:02 , Processed in 0.031492 second(s), 16 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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