在前面的字典介绍中,我们添加Key的时候,没有特别的去注意Key的数据类型,我们先做1个这样的演示操作:
我们将A列的数据添加到1个字典中,和前面不同的操作是,我们没有用数组,而是直接使用了单元格对象,我们也知道单元格缺省的默认属性是Value,从图片中我们可以明显看到,数据是有重复的:
代码语言:javascript复制Sub TestDic3()
'声明
Dim d As Dictionary
'创建
Set d = New Dictionary
Dim rowA As Long
Dim i As Long
'获取A列的最后一行行号
rowA = Cells(Cells.Rows.Count, 1).End(xlUp).Row
'将A列数据记录到字典中
For i = 2 To rowA
d.Add Cells(i, 1), i
Next
'输出字典的Key数量
Debug.Print d.Count
'释放
Set d = Nothing
End Sub
可是我们执行程序,并没有发现错误提示,而且立即窗口输出的是17,和图中的数据数量是一致的,这是为什么呢?
为什么重复的Key没有报错?
难道字典中存在重复的Key了?
1、原因分析:
在前面我们讲过,用d.Add这种方法添加Key的时候,一旦有重复的Key,会出现上图中的错误,既然d.Add Cells(i, 1), i这个操作没有报错,那说明字典就是没有重复的Key,所以,我们应该去看看字典中真正存储的是什么。
我们介绍一种调试的方法,我们定位到某条语句,点击菜单上的调试-切换断点(或者直接在语句的左边框上,点击鼠标左键),会出现一个深褐色的点,语句也会被标记颜色,这时候再执行程序,程序会在断点处停止运行,这个时候再点击视图-本地窗口,我们就可以查看这个模块里的变量了:
点击变量d的 号,展开查看变量里的数据,可以看到,17个Item,数据类型是Variant/Object/Range,我们可以理解它是或者的意思,所以,我们在字典中添加的并不是单元格的内容,而是单元格对象,所以17个Item是不相同的。
2、如何避免
出现这种情况主要是我们没有明确指定我们想要处理的数据的数据类型,在For语句里,我们提到过要养成好的习惯,要清楚自己正在操作的是什么数据类型,需不需进行转换,要转换的话别依赖VBA的自动处理,而是自己明确去转换。
在我们上面要处理的例子里,显然我们希望的是把单元格里的内容,也就是字符串数据添加到字典中,所以我们应该显示的添加VBA.CStr:
代码语言:javascript复制d.Add VBA.CStr(Cells(i, 1)), i
这样我们就算省略了缺省的Value属性,添加到字典中的也是字符串类型的数据了,当然这里最好也把缺省的Value属性加上,清楚的写明自己正在操作的东西。
3、小结
通过对字典Key的添加,了解字典Key虽然什么数据类型都可以传递进去,但是作为使用者一定要清楚自己要添加的数据是什么数据类型,并显示的进行转换,避免不必要的错误。
另外介绍了一个调试的功能,断点、本地窗口来查看局部变量。