excel - 防止循环更新所有子字典值

标签 excel vba dictionary

已经谷歌搜索并尝试了数周,但还没有找到解决方案。

我有一个循环遍历条目列表并尝试制作它们的字典。
我的循环首先检查键是否存在于我们的主字典中 - 如果不存在,它会创建键和所需的子字典 - 然后检查它需要更新的子字典值。下面是代码的简化。

我在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/

相关文章:

mysql - 如何使用php将excel中的数据导出到mysql?

excel - 在 excel 中创建一个公式以在 2 个工作表之间进行搜索

.net - 如何优化这个简单但可怕的实现?

python - 遍历字典或其键并更改值是不好的做法吗?

excel - 遍历列过滤时可见的数据

excel - 如何更改指定列中的单元格颜色?

excel - 在 VBA for Mac 中写入具有长名称的文件

Excel VBA 唯一 ID 生成器

c# - linq过滤后的Dictionary结构如何保存

c++ - STL映射可以与不同大小的键一起使用吗