0

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

c1  c2  c3
c4  c5  c6

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

我试图阅读和实现通过键集合的集合在集合集合中引用对象-如何按值而不是引用来制作子集合?,并且我还尝试使用字典,例如建议的 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

有什么建议吗?非常感谢

4

1 回答 1

1

ACollection没有财产ItemCollectionq要访问集合的元素rigavar,您可以使用以下方法之一

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 (就好像它是一个二维数组一样)。

于 2020-10-15T13:18:20.813 回答