VBA中的嵌套字典:错误457:此键已经与集合元素关联

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

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

产品Id | 客户ID | 资源

1 | 1 | 一个

1 | 2 | 一个

2 | 1 | 一个

3 | 1 | 乙

我想把它转换成一个主字典“DicByUser”,其中的键是用户ID,而这些项是另一个字典,它包含客户访问的产品和源代码的项目。

在这种情况下,我会

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

我的方法是通过我的初始表的所有行,然后:

与Cid的客户ID,

将产品ID,

来源

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告诉我这一点

 Error 457 : this key is already associated with an element of collection 

然后,如果我进入debugging模式,并尝试显示我的对象dicotoadd中的元素数量,我发现1,而对象是在前一行创build的。

我相信在另外一个字典里总是给它一个相同的名字的方式可能会有问题,否则我不明白为什么我在上面创build一行的字典可以包含一个元素

我在做什么错在我的程序中创build一个嵌套的字典在VBA?

编辑:通过改变我的代码解决了以下,由build议由马克杯

 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 

经典陷阱。

  • VBA中variables的最小范围是过程级别
  • As New程序范围内的As New更改对象的生命周期

这是一个应该启发你的简单例子:

 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分支中的事实不会改变它的范围,它仍然是过程范围的本地,并且它不是在Else分支运行时运行的可执行语句

拆分声明和参考作业,您将修复您的错误。