Excel 字典中的条目都有相同的值,尽管它们是单独创建的
我有一个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
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