Collection of Collections - 参考 SubCollection Item with Variable for Primary Collection

Collection of Collections - Refer to SubCollection Item with Variable for Primary Collection

我正在使用(作为示例)在 3x2 矩阵上有六个文本框的用户窗体:像这样:

c1  c2  c3
c4  c5  c6

我正在尝试将这两行文本框添加到一个集合(辅助)中,然后将此集合添加到集合的一个集合(主要)中。 然后使用主集合中集合的变量引用嵌套集合(辅助)中的对象。 喜欢:“集合(主要)”。第一个元素。合集(二级).第三Element.name”是c3.

我尝试阅读并实施 Referencing an object within a collection of collections by key or , and I also tried with a Dictionary like suggested 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。要访问集合 rigavar 的元素 q,您可以使用以下方法之一

rigavar(q)
rigavar.Item(q)

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

由于元素 rigavar(q) 又是一个集合,您可以使用

访问第三个元素
rigavar(q)(3)
rigavar.Item(q)(3)
rigavar.Item(q).Item(3)

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

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