分享

Excel 字典基本语句、以及中级字典运用例子

 liuyunhe1954 2017-02-21
先给个简化版的字典基本语句:


基本功能已经尽在其中了。

如能熟练掌握,则可游刃有余。

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())这样的用法。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约