2011-10-20 13 views
2

コンボボックスを持っています。私は一意のレコードだけを必要とし、私はこのページに切り替えるときにそれらを更新したい。そのために 私は、次のコードを使用:コンボボックス(VBA)内のユニークなレコードのみ

Private Sub MultiPage1_Change() 
Dim Rand As Long 
Dim ws As Worksheet 
Set ws = Worksheets("BD_IR") 
Dim i As Long 
Rand = 3 
Do While ws.Cells(Rand, 3).Value <> "" And Rand < 65536 
    If Me.repereche.ListCount <> 0 Then 
     For i = 0 To (Me.repereche.ListCount) 
     If Me.repereche.List(i, 0) <> Mid(ws.Cells(Rand, 3).Value, 4, 10) Then 
      Me.Controls("repereche").AddItem Mid(ws.Cells(Rand, 3).Value, 4, 10) 
     End If 
     Next i 
    ElseIf Me.repereche.ListCount = 0 Then 
     Me.Controls("repereche").AddItem Mid(ws.Cells(Rand, 3).Value, 4, 10) 
    End If 
    Rand = Rand + 1 
Loop 

このコードの問題は、(問題がどこにあると私は知らないのですか?)私は、ページを変更し、私は戻ってこのページに来たときにということですコンボボックスは...より多くの(ユニークではない)アイテムを追加します。どこが間違っていますか?

+2

コンボボックスにアイテムを追加する前に、そのコンボボックスを消去する必要があります。これは、ページを切り替えるたびに「ますます多くのアイテム」が追加されるのを防ぎます。一意のレコードが必要な場合は、範囲を配列に読み込んで各アイテムをCollectionオブジェクトに追加します。コレクションオブジェクトが重複を拒否するため、ユニークなアイテムのみを追加できます。サンプルコードについては、http://www.dailydoseofexcel.com/archives/2004/05/18/listing-unique-items-with-collections/を参照してください。 – JimmyPena

+0

'Rand'を変数名として使用すると、乱数(' RAND'ワークシート関数のように)になるはずです。 – barrowc

答えて

8

は、このコードを試してみてください。

Dim ws As Worksheet 
Dim rCell As Range 

Set ws = Worksheets("BD_IR") 

'//Clear combobox 
repereche.Clear 

With CreateObject("Scripting.Dictionary") 
    For Each rCell In ws.Range("C3", ws.Cells(Rows.Count, "C").End(xlUp)) 
     If Not .exists(rCell.Value) Then 
      .Add rCell.Value, Nothing 
     End If 
    Next rCell 

    repereche.List = .keys 
End With 

あなたは値ではなく、エラーに使用するよりも辞書に存在するかどうかを確認し、一度にコンボボックスにコレクション全体を追加することができますように私は、コレクションの上にこれを好みます。

+0

良いコードと優れた情報。私は、辞書オブジェクトのコレクションに対する優位性についてこの点については知らなかった。 –

+0

私がそれを望むように働くのは最初のものです。どうもありがとう! –

+0

+1辞書もコレクションよりも効率的です – brettdj

関連する問題