2012-04-22 176 views
2

我正在尝试编写一个函数来对一组对象进行排序。由于对象都是相同的类型(相同的用户定义的类),它们的属性集是相同的。是否有可能发现对象的属性(通过代码),以便将集合放入一个二维数组中,每行都是针对一个对象的,每个列的属性是哪一个?对VBA中的对象集合进行排序

另一种解决方案是将每个对象从集合中复制到一个对象数组中,并通过其属性之一对其进行排序,这些属性的名称作为字符串传递给该函数。但我没有看到如何使用以字符串形式传递的属性名称来指向对象的属性。

回答

4

对于一个集合,它是最好的它的键排序它(这是他们在做什么那里) - 但如果你没有钥匙名单:

'Give an input "Data As Collection" 

    Dim vItm As Variant 
    Dim i As Long, j As Long 
    Dim vTemp As Variant 

    For i = 1 To Data.Count – 1 
     For j = i + 1 To Data.Count 
      If CompareKeys(Data(i).myMemberKey, Data(j).myMemberKey) Then 
       'store the lesser item 
       vTemp = Data(j) 

       'remove the lesser item 
       Data.Remove j 

       're-add the lesser item before the greater Item 
       Data.Add vTemp, , i 
      End If 
     Next j 
    Next i 
(失去你的钥匙!)

想出你自己的CompareKey函数,如果UDT成员变量大于或等于<或0,则返回true或false。您必须删除并重新添加的原因是因为您无法在vb6/vba集合对象中“交换”内部成员。

最好的运气

编辑:

要访问你的程序的名称(如字符串)的属性,使用VB的CallByNamefunction形式:

Result = CallByName(MyObject, "MyProperty", vbGet) 
+4

如果集合充满对象,我认为你需要设置vTemp =数据(j) – 2012-04-23 02:16:15

+0

谢谢,但我怎么能写这个函数来排序数据的任意属性?我必须在函数中对属性的名称进行硬编码吗?我宁愿将它作为参数传递。 – Cutter 2012-04-23 06:06:59

+2

简单易如反掌。使用'CallByName':http://www.pcreview.co.uk/forums/vb6-access-object-properties-name-t1409534.html – 2012-04-23 06:24:31

相关问题