2012-04-22 13 views
2

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

もう1つの解決策は、コレクションの各オブジェクトをオブジェクトの配列にコピーし、名前が関数に文字列として渡されるプロパティのいずれかで並べ替えることです。しかし、文字列として渡されたプロパティの名前を使って、オブジェクトのプロパティをどのように指し示すことができないのか分かりません。収集のための

答えて

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 

UDTメンバー変数が>、<または0の場合、trueまたはfalseを返す独自のCompareKey関数を使用してください。削除して再追加する必要があるのは、vb6/vbaコレクションオブジェクトの内部メンバーを「スワップ」できないためです。

EDIT運のベスト:

あなたがプログラム的に(文字列として)の名前を持つプロパティにアクセスするには、VBのCallByNamefunction形式でを使用します。

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

コレクションの場合あなたが必要と思うオブジェクトがいっぱいです。Set vTemp = Data(j) –

+0

ありがとうございます。しかし、任意のプロパティでデータをソートするにはどうすればいいですか?関数内のプロパティの名前をハードコードする必要がありますか?私は議論としてそれを渡すことを好むだろう。 – Cutter

+2

パイとして簡単。 'CallByName'を使う:http://www.pcreview.co.uk/forums/vb6-access-object-properties-name-t1409534.html –

関連する問題