在VBA中对对象集合进行排序

时间:2012-04-22 23:48:59

标签: vba sorting collections excel-vba excel

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

另一种解决方案是将每个对象从集合中复制到一个对象数组,并按其属性之一对其进行排序,其属性作为字符串传递给函数。但我不知道如何使用作为字符串传递的属性名称指向对象的属性。

1 个答案:

答案 0 :(得分:6)

对于一个集合,最好通过它的键(这就是它们的用途)对它进行排序 - 但是如果你没有键列表(丢失你的键!):

'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成员变量是>,则返回true或false。或0到另一个。您必须删除和重新添加的原因是因为您无法在vb6 / vba集合对象中“交换”内部成员。

祝你好运

编辑:

要以编程方式(作为字符串)访问属性,请使用以下格式的VB CallByName function

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