我试图在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,
来源
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
然后,如果我进入调试模式,并试图显示对象dicotoadd中的元素数,就会发现1,而该对象是在前面的行中创建的。
我相信我把字典放入另一本字典的方式可能有问题,因为我总是给它取一个同名,否则我就不明白为什么我在上面创建的一行字典已经包含了一个元素。
在用vba创建嵌套字典的过程中,我做错了什么?
编辑:按照Mat‘code的建议,通过将我的代码更改为下面的代码来解决
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
发布于 2016-06-30 17:28:24
经典陷阱。
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
分支中的事实并不改变它的作用域,它仍然是过程的本地范围----它不是在分支运行时运行的可执行语句。
将声明和引用分配分开,您将修复您的错误。
https://stackoverflow.com/questions/38128370
复制相似问题