2014-03-19 44 views
2

首先,道歉,这是我的第一篇文章,因此我可能没有使用最佳实践。引用钥匙集合中的对象

我在写一个使用VBA for Excel的应用程序。

我创建了一个Class,然后安装了该Class的几个对象并将它们添加到Collection中。然后,我将Collection添加到另一个集合中,并重复该过程,以便我最终得到同一个类的对象集合集合,就像我想的层次结构。

每当我添加到一个集合,我创建一个密钥来唯一标识我添加的东西。我现在想用键来引用“层次结构”中的特定对象。

下面的伪代码有希望地解释了创建对象的过程,添加到一个新的集合,然后将集合添加到一个新的集合(注意为了简单起见,我只添加了一个对象,从而导致一个分支层次结构,而我的实际代码将多个对象添加到多个集合中)。

Public Element As CElement 
Public InsideCollection As Collection 
Public OutsideCollection As Collection 

Sub Main() 

    Set Element = New CElement 
    Set InsideCollection = New Collection 
    Set OutsideCollection = New Collection 

    Element.Field1 = "blah1" 
    Element.Field2 = "blah2" 

    InsideCollection.Add Element, Element.Field1 

    OutsideCollection.Add InsideCollection, "ABCD" 

End Sub 

现在,我已经加载这个数据变成了一种层次结构的,我怎么没有获得通过寻找正确的所有元素循环在最低级别的访问特定的元素?我还以为我可以做线沿线的东西:

OutsideCollection("ABCD").InsideCollection("blah1").Field2 

OutsideCollection.InsideCollection("blah1").Field2 

但他们给这个错误:

Run-time error '438': Object doesn't support this property or method

我也试图与上述通过整数值引用元素,例如。

OutsideCollection(1).InsideCollection(1).Field2 

但是得到相同的错误。

任何想法?

干杯,克里斯

回答

2

长的路要走。让我们定义两个额外的变量innerColinnerEl

Dim innerCol As Collection 
Dim innerEl As CElement 

,然后通过key来OutsideCollection收藏价值:

Set innerCol = OutsideCollection("ABCD") 

现在innerCol包含CElements集合。让我们通过键获取单个元素:

Set innerEl = innerCol("blah1") 

可变innerEl包含CElement类型的对象,我们可以得到它的属性:

MsgBox innerEl.Field1 ' returns "blah1" 
MsgBox innerEl.Field2 ' returns "blah2" 

短道,无需额外的变量,我们可以使用这一个:

MsgBox OutsideCollection("ABCD")("blah1").Field1 ' returns "blah1" 
MsgBox OutsideCollection("ABCD")("blah1").Field2 ' returns "blah2" 
+1

出色的工作simoco - 感谢这么多 – user3436085

0

要通过文字访问对象有“!”操作:在立即窗口

Sub test_collection_intf() 
    Dim v_a As New Collection 
    v_a.Add Item:=New Collection, Key:="first" 
    v_a!first.Add Item:=CreateObject("Scripting.Dictionary"), Key:="red" 
    v_a!first!red!Type = "color" 

    v_a.Add Item:=New Collection, Key:="second" 
    v_a!Second.Add Item:=CreateObject("Scripting.Dictionary"), Key:="green" 
    v_a!Second!green!scheme = "RGBA" 

    Debug.Print "Access by literals" 
    Debug.Print "v_a!first!red.Count:"; v_a!first!red.Count; "v_a!first!red!type: "; v_a!first!red!Type 
    Debug.Print "v_a!Second!green.Count"; v_a!Second!green.Count; "v_a!Second!green!RGBA: "; v_a!first!red!RGBA 
    Debug.Print "v_a!Second!green!scheme: "; v_a!Second!green!scheme 
' But it is impossiable to use a variable to acces field of object as in Perl 
' Dim v_key_l1 As String, v_key_l2 As String 
' v_key_l1 = "first": v_key_l2 = "red" 
' Debug.Print "v_a!v_key_l1!v_key_l2:"; v_a; !v_key_l1; !v_key_l2 
' v_key_l1 = "second": v_key_l2 = "green" 
' Debug.Print "v_a!v_key_l1!v_key_l2:"; v_a!v_key_l1!v_key_l2 
End Sub 

输出:

Access by literals 
v_a!first!red.Count: 1 v_a!first!red!type: color 
v_a!Second!green.Count 1 v_a!Second!green!RGBA: 
v_a!Second!green!scheme: RGBA