vba引用DICTIONARY对象的add方法添加关键字提示“运行时错误457,提示该关键字已经与集合中的一个元素相关”
解决办法:
1.从对象浏览器查看引用的Dictionary属于哪个类库,Excel应该用Scripting类库的
2.查找有无同样名称的Dictionary对象
3.如果都找了确定没问题,那么在程序开始加上APPLICATION.SCREENUPDATING=FALSE  ON ERROR RESUME NEXT,程序结尾处重置屏幕更新就解决了。
亲身经历,血的教训。希望能帮到大家。

解决方案 »

  1.   

    呵呵,你觉得你这个所谓“教训”能对别人有帮助?
    拉倒吧…………
    对于“第1”:一般用Dictionary对象,都是用系统提供的Scripting类库中的 Dictionary类。
      若有特殊需求,才可能自己实现,或者引用别的类库中的实现。对于“第2”:一般来说,不同作用或在不同作用域中的“特定变量”,变量名都不同的。
      代码中“有无同样名称的Dictionary对象”,自己难道不清楚?还需要找么…………对于“第3”:
      APPLICATION.SCREENUPDATING=FALSE 基本上仅用于在Excel的VBA中使用。
      如果被操作的工作表本身就没在“前台”,或者本来就是“不可见”的(比如我用VB6代码,通过
    COM接口操作Excel的工作表),这句代码恐怕就没有实质作用。
      最主要的,On Error Resume Next 并不是“用于解决 运行时错误457”的!
      你这次的使用,似乎“解决问题”了,也许只是“巧合”、刚好能符合你的预期而已!
      但别人也许需求完全不同,需要“切实处理”这种关键字重复问题时,
    岂能简单用个的“On Error Resume Next”去“忽视运行时异常”就行???
    实际需求不同,处理方式并不是“相同”的,你说的这个方法根本不具备通用性,
    并且,我也不觉得你的应用场景中“On Error Resume Next”唯一的方法,而是有“更好”的方法!
      

  2.   

    字典的key本来就是唯一的,有什么奇怪的。
      

  3.   

    应该这样改:
    dim dict as new dictionary
    ' ...
    if dict.exists(key) then
        msgbox key & "已经存在!"
        dict.item(key) = value ' 可选
    else
        dict.add(key,value)
    end if
    ' ...
      

  4.   

    错了,应该这样改:
    dim dict as new dictionary
    ' ...
    if dict.exists(key) then
        msgbox key & "已经存在!"
        dict.item(key) = value ' 可选
    else
        call dict.add(key,value) ' 增加个Call,或者去掉括号也可以.
    end if
    ' ...
      

  5.   

    VBA不需要打call!