2016-11-01 4 views
1

動作していない私は、配列から一意の値を取得するためのコレクションを持っていますが、何らかの理由では、アレイを通過するが、コレクションが最終的にコレクションのコードがあるVBA Collection.Add

を示しています

Dim Materials as Variant 
Dim Unique as New Collection, a 

On Error Resume Next 
For Each a In Materials 
    Unique.Add a, a 
Next 

これはなぜ洞察力を提供することができますか?

+0

「a」にはどのような値が格納されていますか?コレクションのキー値が文字列でなければならないので、 'a'が数字の場合は型不一致が発生しますが、' On Error Resume Next'はそれを隠します。 'Unique.Add a、CSTR(a)'を試してください。しかし、あなたが投稿したコードは実際に問題をテストするのを困難にする 'Materials'に値を割り当てません(私が知っているすべてのフォームコントロールをMaterialsに割り当てることができます)。 –

+2

初心者がよく知っているはずの人がコードで 'On Error Resume Next'を見ると、初心者がそれらをコピーします。それは、エラーがある場合、私に教えてもらうことを気にしないでください。それを削除し、エラーメッセージが表示されるかどうかを確認してください。 –

+0

定義されているように、「材料」は変形です。 'Materials = Array(x、y、z)'のように配列を配置することができます。あなたは? –

答えて

2

コレクションを実際に作成したい場合(たとえば、アイテムを最初に表示する順序でアイテムを保持したい場合など)、コレクションを構築する際に一時的なデータ構造として辞書を使用することをお勧めします。

Sub test() 
    Dim Materials As Variant, C As Collection, v As Variant 
    Materials = Array(2, 3, 5, 2, 6, 5, 7, 4, 2) 
    Set C = Uniques(Materials) 
    For Each v In C 
     Debug.Print v 
    Next v 
End Sub 

出力::のようにテストされた

Function Uniques(A As Variant) As Collection 
    Dim D As Object, C As New Collection 
    Set D = CreateObject("Scripting.Dictionary") 
    Dim v As Variant 

    For Each v In A 
     If Not D.exists(v) Then 
      D.Add v, 1 
      C.Add v 
     End If 
    Next v 

    Set Uniques = C 
End Function 

:ような何か

2 
3 
5 
6 
7 
4 

あなたが望むすべてがセットのようなオブジェクトではなく、それ自体はコレクションである場合、あなたはスキップすることができコレクションは完全にUniques()(適切に修正されている)が辞書自体を返すだけです。