已经谷歌搜索并尝试了数周,但还没有找到解决方案。
我有一个循环遍历条目列表并尝试制作它们的字典。
我的循环首先检查键是否存在于我们的主字典中 - 如果不存在,它会创建键和所需的子字典 - 然后检查它需要更新的子字典值。下面是代码的简化。
我在excel表中有以下数据:
A. B. C.
1 product1 item1 used
2 product2 item2 new
3 product1 item3 removed
4 product1 item3 removed
5 product3 item5 new
6 product4 item2 new
7 product2 item1 used
8 product1 item3 new
9 product4 item2 removed
10 product5 item1 used
所以现在循环应该遍历每一行并确定每个产品有多少已使用、新的和已删除的每个项目。
Sub example()
Set test_dict = New Scripting.Dictionary
For i = 1 To 10
product_name = Cells(i, 1).Value
item_name = Cells(i, 2).Value
item_status = Cells(i, 3).Value
If test_dict.Exists(product_name) = False Then
Set item_dict = New Scripting.Dictionary
item_dict.Add item_name, 0
Set status_dict = New Scripting.Dictionary
status_dict.Add "used", item_dict
status_dict.Add "new", item_dict
status_dict.Add "removed", item_dict
test_dict.Add product_name, status_dict
End If
test_dict(product_name)(item_status)(item_name) = test_dict(product_name)(item_status)(item_name) + 1
Next
End Sub
它应该产生如下内容:
test_dict
|
|--> "product1"
| |--> "used"
| | |-> "item1" = 1
| | '-> "item3" = 0
| |-> "new"
| | |-> "item1" = 0
| | '-> "item3" = 1
| '-> "removed"
| |-> "item1" = 0
| '-> "item3" = 2
|--> "product2" (etc.)
但无论出于何种原因,我的循环都会不断更新所有子目录,即
test_dict
|
|--> "product1"
| |--> "used"
| | |-> "item1" = 1 *<-- correct value for item1*
| | '-> "item3" = 2 *<-- false value for item3*
| |-> "new"
| | |-> "item1" = 1 *<-- false value for item1*
| | '-> "item3" = 2 *<-- false value for item3*
| '-> "removed"
| |-> "item1" = 1 *<-- false value for item1*
| '-> "item3" = 2 *<-- correct value for item3*
|--> "product2" (etc.)
关于我在这里做错了什么的任何想法?
我一遍又一遍地检查我的代码,我尝试了不同的方法来做同样的事情,但不知何故我总是以问题告终。
最佳答案
status_dict.Add "used", item_dict
status_dict.Add "new", item_dict
status_dict.Add "removed", item_dict
您正在添加 相同字典对象
item_dict
这里3次。因此,如果您在 3 个实例中的任何一个中 +1,它将影响所有实例。
为避免这种情况,您需要创建一个 新 3 个实例中的每一个的字典对象。
编辑:例如
Set status_dict = New Scripting.Dictionary
For x = 1 To 3
Set item_dict = New Scripting.Dictionary
item_dict.Add item_name, 0
strStatus = Choose(x, "used", "new", "removed")
status_dict.Add strStatus, item_dict
Next x
test_dict.Add product_name, status_dict
关于excel - 防止循环更新所有子字典值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50527014/