先给个简化版的字典基本语句:
基本功能已经尽在其中了。 如能熟练掌握,则可游刃有余。 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())这样的用法。 |
|
来自: liuyunhe1954 > 《Excel VBA》