Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.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
Arrays 如何在VBA中创建自定义类的二维数组或集合?_Arrays_Vba_Class - Fatal编程技术网

Arrays 如何在VBA中创建自定义类的二维数组或集合?

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

我有一个自定义类,以及该类的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 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