2011-10-20 71 views
2

我有一個組合框,其中我從Excel表中添加一些東西與一堆東西。我只需要唯一的記錄,並且我希望在切換到此頁面時更新它們。 對於我用下面的代碼:Combobox(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對象 - 這將允許您僅添加唯一項目,因爲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

Nice代碼和良好的信息。在這方面,我不知道字典對象對集合的優越性。 –

+0

太好了。這是它的第一個工作,因爲我想要它。非常感謝! –

+0

+1詞典也比集合更節省時間 – brettdj