Arrays 如何在VBA中创建自定义类的二维数组或集合?
我有一个自定义类,以及该类的700个实例。其中一些实例共享特定属性(TourID)的相同值。我想根据它们的TourID值将这些实例组合成2D数组或集合 创建2D数组会导致类型不匹配错误,并且创建集合不允许将带有TourID值的键分配给项Arrays 如何在VBA中创建自定义类的二维数组或集合?,arrays,vba,class,Arrays,Vba,Class,我有一个自定义类,以及该类的700个实例。其中一些实例共享特定属性(TourID)的相同值。我想根据它们的TourID值将这些实例组合成2D数组或集合 创建2D数组会导致类型不匹配错误,并且创建集合不允许将带有TourID值的键分配给项 Dim list_of_stops() As New Stops For i = 0 To UBound(list_tours) LastValue = Ubound(list_of_stops(list_tours(i).TourID)) Redim Pres
Dim list_of_stops() As New Stops
For i = 0 To UBound(list_tours)
LastValue = Ubound(list_of_stops(list_tours(i).TourID))
Redim Preserve list_of_stops(list_tours(i).TourID, LastValue + 1)
list_of_stops(list_tours(i).TourID, LastValue) = list_tours(i)
Next
我希望按以下方式构造\u停止列表()
list_of_stops(1,0) = first stop with tour ID = 1
list_of_stops(1,1) = second stop with tour ID = 1
...
list_of_stops(1,n) = n-th stop with tour ID = 1
...
list_of_stops(n,n) = n-th stop with tour ID = n
我无法解释为什么在看不到更多代码(主要是声明)的情况下会出现类型不匹配错误,但如果没有
Set
关键字,则赋值可能会导致let强制,从而失败(虽然,我遗漏了一些东西,因为这可能是错误91,或者如果类有一个默认属性,最接近类型不匹配的是编译时的“无效使用属性”)
不管怎样,如果有一个字典
键入唯一的TourID
值,保存一个包含该TourID
值的所有实例的集合,你的生活会更简单
请参考Microsoft脚本运行库(Scripting
):
现在,如果迭代字典条目,则每个项都是一个集合
,在每个集合中,每个项都是一个停止
实例(为什么它是复数的?它是一个自定义集合类?)。这使得立即检索所有停止点的集合非常容易,给定一个巡回我无法解释为什么在没有看到更多代码(主要是声明)的情况下会出现类型不匹配错误,但如果没有Set
关键字,则赋值可能会导致let强制,而这会失败(虽然,我遗漏了一些东西,因为这可能是错误91,或者如果类有一个默认属性,最接近类型不匹配的是编译时的“无效使用属性”)
不管怎样,如果有一个字典
键入唯一的TourID
值,保存一个包含该TourID
值的所有实例的集合,你的生活会更简单
请参考Microsoft脚本运行库(Scripting
):
现在,如果迭代字典条目,则每个项都是一个集合
,在每个集合中,每个项都是一个停止
实例(为什么它是复数的?它是一个自定义集合类?)。这使得即时检索所有站点的集合变得非常容易,因为TourID
如果LastValue=Ubound(站点列表(list_touris(i).TourID))
在站点列表()
尚未确定维度时有何意义?在任何情况下,1)一本字典而不是一本藏书可能是一个不错的选择,2)一本书会有所帮助。实际上,我们不能不费吹灰之力地运行代码。此外,数组声明行中的New
也不能真正起作用sense@JohnColeman它使每个数组元素成为一个自动实例化的对象。。。这确实很奇怪(从未见过),但显然是合法的Dim foo(1到10)作为新集合,然后Debug.Print foo(2)为Nothing
将输出False
,即使您从未为任何对象引用设置任何下标。@MathieuGuindon。我很惊讶它是合法的。@johncolman我也是,并且很高兴RD的检查正在标记它=)当list\u of_stops()
还没有确定尺寸时,LastValue=Ubound(list\u of_stops(list\u tours(I.TourID))
有什么意义?无论如何,1)一本字典而不是一本藏书可能是一个不错的选择,2)一本书会有所帮助。实际上,我们不能不费吹灰之力地运行代码。此外,数组声明行中的New
也不能真正起作用sense@JohnColeman它使每个数组元素成为一个自动实例化的对象。。。这确实很奇怪(从未见过),但显然是合法的Dim foo(1到10)作为新集合,然后Debug.Print foo(2)为Nothing
将输出False
,即使您从未为任何对象引用设置任何下标。@MathieuGuindon。我很惊讶它是合法的。@johncolman我也是,很高兴RD的检查显示它=)
Dim values As Dictionary
Set values = New Dictionary ' avoid "As New" unless you *NEED* an auto-instantiated object
Dim k As Variant
Dim currentGroup As Collection
For Each k In GetUniqueValuesForTourID 'TODO: a function that returns the unique IDs
Set currentGroup = New Collection
Dim v As Variant
For Each v In GetAllValuesForTourID(k) 'TODO: a function that returns the records for given ID
currentGroup.Add v, k 'note: Collection.Add value, key
Next
Set values(k) = currentGroup 'note the "Set" keyword; or: Dictionary.Add key, value
Next