集合的集合-有关主要集合,请参阅带有变量的子集合项

问题描述

我正在(例如)使用一个在3x2矩阵上带有六个TextBox的UserForm:

c1  c2  c3
c4  c5  c6

我正在尝试将这两个文本框行都添加到集合(辅助)中,然后将此集合添加到集合的集合(主)中。 然后在嵌套Collection(次级)中使用主要Collection中的Collection变量引用该对象。 就像:“集合(主要)。第一个元素。集合(次要)。第三元素。名称为c3。

我尝试阅读并实现Referencing an object within a collection of collections by keyCollection of Collections - How to make sub-collections by value rather than reference?,并且还尝试使用类似建议的Dynamically Create collection of Collections VBA的字典,但我不断得到:

运行时错误“ 438”:对象不支持属性方法

在此行上(或在下面的代码中发布的行变体之一):

If rigavar.ItemCollection(q)(3).Name = "c3" Then

我尝试理解并改编了这些示例,但我只是无法完成,也不知道我是否缺少某些东西,或者我做的是完全错误的,或者我只是不理解事情如何运作或全部运作。

我通过为每行仅创建一个集合并为每个单个集合创建特定过程来解决。 当例程到达某个集合时,它将使用该集合的特定引用来触发该例程,如下所示:

Private Sub workaround_Click() 
    Set rigaAA = New Collection
    rigaAA.Add c1
    rigaAA.Add c2
    rigaAA.Add c3
    
    Set rigaBB = New Collection
    rigaBB.Add c4
    rigaBB.Add c5
    rigaBB.Add c6
    
    If rigaAA.ItemCollection(3).Name = "c3" Then
    
    Call rigaAAspecificRoutine
        
        End if
    End sub

    Private Sub rigaAAspecificRoutine()
        MsgBox c1.value & c2.value  & c3.value
    End sub

但是我希望通过变量而不是特定的方式来完成它,例如:

Private Sub test_Click()

Dim rigaAA As VBA.Collection
Dim rigaBB As VBA.Collection
Dim rigavar As VBA.Collection

Set rigaAA = New Collection
rigaAA.Add c1
rigaAA.Add c2
rigaAA.Add c3

Set rigaBB = New Collection
rigaBB.Add c4
rigaBB.Add c5
rigaBB.Add c6

Set rigavar = New Collection
rigavar.Add rigaAA
rigavar.Add rigaBB

'none of this works:

For q = 1 To 2
    If rigavar.ItemCollection(q)(3).Name = "c3" Then
        MsgBox c1.value & c2.value  & c3.value
    End If
Next

For q = 1 To 2
    If rigavar.ItemCollection(q)(3).Name = "c3" Then
        MsgBox c1.value & c2.value  &  c3.value
    End If
Next

For q = 1 To 2
    If rigavar.ItemCollection(q,3).Name = "c3" Then
        MsgBox c1.value & c2.value  & c3.value
    End If
Next

For q = 1 To 2
    If rigavar.ItemCollection(q).ItemCollection(3).Value <> "" Then
        MsgBox c1.value & c2.value  & c3.value
    End If
Next
    
End Sub

有什么建议吗? 非常感谢

解决方法

Collection没有属性ItemCollection。要访问集合q的元素rigavar,可以使用以下方法之一

rigavar(q)
rigavar.Item(q)

(通常使用较短的形式,这基本上是较长形式的缩写,因为Item属性是集合的所谓的 default属性)。

由于元素rigavar(q)再次是集合,因此您可以使用来访问第三个元素

rigavar(q)(3)
rigavar.Item(q)(3)
rigavar.Item(q).Item(3)

检查控件名称的最简单方法是使用rigavar(q)(3).Name

您不能做的是写rigavar(q,3),因为现在VBA会将这两个参数作为参数传入rigavar.Item(就好像是二维数组一样)。