我正在尝试编写一个对对象集合进行排序的函数。由于对象都是相同的类型(相同的用户定义类),它们的属性集是相同的。是否有可能(通过代码)发现对象的属性,以便将集合放入一个二维数组中,每一行代表一个对象,每一列代表它的一个属性?
另一种解决方案是将集合中的每个对象复制到一个对象数组中,并根据它们的一个属性对它们进行排序,该属性的名称作为字符串传递给函数。但是我看不到如何使用作为字符串传递的属性名称来指向对象的属性。
我正在尝试编写一个对对象集合进行排序的函数。由于对象都是相同的类型(相同的用户定义类),它们的属性集是相同的。是否有可能(通过代码)发现对象的属性,以便将集合放入一个二维数组中,每一行代表一个对象,每一列代表它的一个属性?
另一种解决方案是将集合中的每个对象复制到一个对象数组中,并根据它们的一个属性对它们进行排序,该属性的名称作为字符串传递给函数。但是我看不到如何使用作为字符串传递的属性名称来指向对象的属性。
对于一个集合,最好按它的键对其进行排序(这就是它们的用途)——但如果你没有键列表(丢失了你的键!):
'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 集合对象中“交换”内部成员。
祝你好运
编辑:
要以编程方式访问您具有名称的属性(作为字符串),请以下列形式使用 VBCallByName
函数:
Result = CallByName(MyObject, "MyProperty", vbGet)