首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >嵌套字典( VBA : Error 457 ):此键已与集合元素相关联

嵌套字典( VBA : Error 457 ):此键已与集合元素相关联
EN

Stack Overflow用户
提问于 2016-06-30 16:09:33
回答 1查看 741关注 0票数 1

我试图在vba中创建一个字典结构的字典

基本上,我从一个3列表开始:

产品Id -客户Id -源

1\x{e76f}1

1--2-A

2--1-A

3\x{e76f}

我想把它转换成一个主字典"DicByUser“,其中键是用户it,项是另一个字典,它包含客户端访问的产品作为密钥,作为条目包含源代码。

如果那样的话,我会

DicByUser= {1:{1: A,2:a,3: B},2:{1:a}

我的方法是遍历初始表的所有行,然后:

用Cid的客户身份,

Pid产品Id,

来源

代码语言:javascript
运行
复制
If DicByUser.Exists(Cid) Then
    If DicByUser.Item(Cid).Exists(Pid) Then
        'We do something on the item
    Else
        DicByUser.Item(Cid).Add Pid, source
    End If
 Else
    Dim dicotoadd As New Scripting.Dictionary
    dicotoadd.Add Pid, source
    DicByUser.Add Cid, dicotoadd

奇怪的是,最后一行给出了错误: vba告诉我

代码语言:javascript
运行
复制
Error 457 : this key is already associated with an element of collection

然后,如果我进入调试模式,并试图显示对象dicotoadd中的元素数,就会发现1,而该对象是在前面的行中创建的。

我相信我把字典放入另一本字典的方式可能有问题,因为我总是给它取一个同名,否则我就不明白为什么我在上面创建的一行字典已经包含了一个元素。

在用vba创建嵌套字典的过程中,我做错了什么?

编辑:按照Mat‘code的建议,通过将我的代码更改为下面的代码来解决

代码语言:javascript
运行
复制
If DicByUser.Exists(Cid) Then
    If DicByUser.Item(Cid).Exists(Pid) Then
        'We do something on the item
    Else
        DicByUser.Item(Cid).Add Pid, source
    End If
 Else
    Dim dicotoadd As Scripting.Dictionary
    Set dicotoadd = New Scripting.Dictionary
    dicotoadd.Add Pid, source
    DicByUser.Add Cid, dicotoadd
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-30 17:28:24

经典陷阱。

  • VBA中变量的最小作用域是过程级。
  • 过程作用域的As New更改对象的生存期

下面是一个简单的例子,可以启发您:

代码语言:javascript
运行
复制
Public Sub DoSomething()

    Dim c1 As New Collection 'notice: As New
    c1.Add "TEST"
    Set c1 = Nothing
    c1.Add "this will NOT throw runtime error 91"

    Dim c2 As Collection
    Set c2 = New Collection
    c2.Add "TEST"
    Set c2 = Nothing
    c2.Add "this WILL throw runtime error 91"

End Sub

您的代码声明了DicByUser As New --它在Else分支中的事实并不改变它的作用域,它仍然是过程的本地范围----它不是在分支运行时运行的可执行语句。

将声明和引用分配分开,您将修复您的错误。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38128370

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档