|
先给个简化版的字典基本语句:
基本功能已经尽在其中了。
如能熟练掌握,则可游刃有余。
Sub DicTest()
Set Dic = CreateObject("Scripting.Dictionary") 'use Dictionary
'引用字典 【按后期绑定方式引用,这样代码比较通用。】
' 如采取前期绑定 Dim Dic as New Dictionary 则可能有些电脑没有引用Scripting Runtime设置而不能用
'语法:Dic(Key) = Item 将[关键词/项目]同时加入字典 并能忽略关键词不存在错误
Dic("A") = "A1" 'Add [key/item] if key is new
'如果key不存在则直接加入[key/item]
Dic("A") = "A2" 'Cover [item] if key is exists without Err
'如果key存在则覆盖更新item 且不产生key存在的错误提示
'因此本质上,用这个方法给字典赋值、比使用 Dic.Add 更好!
'(如需要对key存在进行错误处理,可使用Dic.Exists(key)方法,更加灵活。例子在下面
Dic.key("A") = "B" 'Change exists key to new key and erase old key
'当key和item已经存在时,更新key内容但保留已经存在的item内容。
'其实这个语句实际意义不大。即实际使用的情况很少,几乎没有。
'备注:也可以用 tmp = Dic("A") : Dic.Remove("A") : Dic("B")= tmp来完成。
Dic("B") = "B1" 'Cover [item] if key is exists
Dic("C") = "C1" 'Add [key/item] if key is new
Dic(1) = 1 'you can use number as key
'通常使用Sting文本字符串作为字典key关键词,也可以使用数字、数值作为key
'但特别提醒: 如果整个字典关键词中既有数字又有字符串,应统一为字符串格式以提高效率
'否则运行速度可能会慢十倍以上。
'速度差异: 纯数字>纯文本字符>>>文本/数值混合型
'下面是Dic.Exists(key)方法的常用模式: 和If判断结合起来使用
For i = 1 To 2
If Not Dic.Exists(i) Then
Dic(i) = i 'if key not exists then add [key/item]
'如果检查发现字典中尚不存在关键词、则加入字典 (一般会这么用)
Else
Dic(i) = Dic(i) * 10 'if key exists then Change [item]
'如果检查发现字典中已经存在关键词、则更新字典中key对应的item (或什么也不做)
End If
Next
'提取字典中keys/items结果分别得到各自的一维数组、顺序为加入字典时的先后顺序
kr = Dic.keys 'Get keys result as Array
tr = Dic.items 'Get items result as Array
'循环遍历字典中的keys/items内容
For i = 0 To Dic.Count - 1 t1 = kr(i)
t2 = tr(i)
Next
'把字典中keys/items结果分别输出到工作表的某一列
[a1].Resize(Dic.Count) = WorksheetFunction.Transpose(Dic.keys) 'Output keys result
[b1].Resize(Dic.Count) = WorksheetFunction.Transpose(Dic.items) 'Output items result
End Sub
需要注意的是,一般推荐把工作表区域中的内容读入VBA内存数组,然后再使用。
此时得到的结果,默认都已经是Range(Rng).Value ,所以字典使用不会有问题。
但有些初学者会直接引用单元格使用,此时必须按 Dic(Range("A1").Value) = item 方式使用字典。
否则即会错误地把 Range("A1")装入字典而产生非预期的结果。
话说,我到现在也不知道,把Range()对象装入字典有何实际意义。也许只是一种未排除的错误用法。
所以我的建议是:大家完全不需要考虑Dic(Range())这样的用法。 |
评分
-
28
查看全部评分
-
|