4

オブジェクトのコレクションをソートする関数を作成しようとしています。オブジェクトはすべて同じ型 (同じユーザー定義クラス) であるため、それらのプロパティ セットは同じです。オブジェクトのプロパティを (コードを介して) 検出して、コレクションを 2 次元配列に配置し、各行がオブジェクト用で、各列がそのプロパティの 1 つを表すことは可能ですか?

もう 1 つの解決策は、各オブジェクトをコレクションからオブジェクトの配列にコピーし、名前が文字列として関数に渡されるプロパティの 1 つで並べ替えることです。しかし、文字列として渡されたプロパティの名前を使用してオブジェクトのプロパティを指す方法がわかりません。

4

1 に答える 1

8

コレクションの場合は、キーで並べ替えるのが最善です (それが目的です)。ただし、キー リストがない場合 (キーを紛失した場合):

'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

UDT メンバー変数が相互に >、<、または 0 の場合に true または false を返す独自の CompareKey 関数を考え出します。削除して再度追加する必要があるのは、vb6/vba コレクション オブジェクトの内部メンバーを「交換」できないためです。

幸運を祈ります

編集:

プログラムで (文字列として) 名前を持つプロパティにアクセスするには、次の形式でVB のCallByName 関数を使用します。

 Result = CallByName(MyObject, "MyProperty", vbGet)
于 2012-04-23T00:23:05.337 に答える