Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 字典中的条目都有相同的值,尽管它们是单独创建的_Excel_Vba - Fatal编程技术网

Excel 字典中的条目都有相同的值,尽管它们是单独创建的

Excel 字典中的条目都有相同的值,尽管它们是单独创建的,excel,vba,Excel,Vba,我有一个excel表格,用于1:n-关系 ID value ---------- 1 A 1 B 1 C 2 A 2 B 3 F 4 X 4 Z 以及一个对象(CValueMap),该对象应存储给定ID的值: Option Explicit Public id As Integer Public values As Collection 我通过迭代行、创建CValueMap(如果字典中还没有)并填充值来读取excel表 Dim idCell As Rang

我有一个excel表格,用于
1:n-关系

ID  value
----------
1   A
1   B
1   C
2   A
2   B
3   F
4   X
4   Z
以及一个对象(
CValueMap
),该对象应存储给定ID的值:

Option Explicit

Public id As Integer
Public values As Collection
我通过迭代行、创建
CValueMap
(如果字典中还没有)并填充值来读取excel表

Dim idCell As Range
Dim allValues As New Scripting.Dictionary
allValues.RemoveAll

For Each idCell In Range("id_value_table[ID]")
    If Not allValues.Exists(idCell.value) Then
        Dim newValueMap As New CValueMap
        newValueMap.id = idCell.value
        Set newValueMap.values = New Collection
        allValues.Add idCell.value, newValueMap
    End If

    Dim valueMap As CValueMap
    Set valueMap = allValues.Item(idCell.value)
    valueMap.values.Add idCell.Offset(0, 1).value
Next idCell
现在我假设我有4个
CValueMap
s,其中第一个有
ABC
,第二个有
AB
,第三个有
F
和最后一个
XZ
作为值。然而,情况并非如此,因为该代码显示:

'iterate allValues
Dim singleKey as Variant
For Each singleKey In allValues.Keys
    Debug.Print singleKey & " has these values:"
    Debug.Print "ID: " & allValues.Item(singleKey).id
    Dim value As Variant
    For Each value In allValues.Item(singleKey).values
        Debug.Print "  " & value
    Next value
Next singleKey


我真的不确定我哪里出错了。根据该行为,我假设相同的值映射可能已写入
allValues
字典中的每个条目,但是,由于我确实创建了4个不同的值,并在添加
值之前正确加载了它们,所以我看不出这可能发生在哪里。

为您提供的对象课程-永远不要使用
Dim。。。作为新对象…
因为您无法控制何时或是否获得新对象

需要对代码进行简单更改:

Dim idCell                As Range
Dim allValues             As Scripting.Dictionary
Dim newValueMap           As CValueMap

Set allValues = New Scripting.Dictionary
allValues.RemoveAll

For Each idCell In Range("id_value_table[ID]")
    If Not allValues.Exists(idCell.value) Then
        Set newValueMap = New CValueMap
        newValueMap.id = idCell.value
        Set newValueMap.values = New Collection
        allValues.Add idCell.value, newValueMap
    End If

    Dim valueMap          As CValueMap
    Set valueMap = allValues.Item(idCell.value)
    valueMap.values.Add idCell.Offset(0, 1).value
Next idCell

在结束之前,如果,请添加以下行:

Set newValueMap = Nothing

所以
Dim。。。作为新的…
实际上不仅仅是编写
Dim…
Set…=新…
?互联网上可能有很多指南需要更新。谢谢这解决了我的问题!基本上是这样,但这相当于将这两行都放在过程顶部和循环外部,因此只创建一次对象变量。在我看来,这既懒惰又危险。在将对象添加到字典后,您可以保留该语法并添加
Set newValueMap=Nothing
,但我仍然认为这是糟糕的编程。
Set newValueMap = Nothing