2013-11-03 80 views
2

我有兩個ListBoxes。 ListBox1具有可由用戶通過雙擊該項目或按下添加按鈕來轉移到ListBox2的項目列表。我現在想要做的是防止用戶在ListBox2中添加重複項。如果檢測到重複,則會有一條消息提示「已包含的項目」並結束該代碼。我猜這可以用包含?但我不知道該怎麼做。我有以下代碼:防止從列表框1添加項目到列表框2(VBA excel)

'Report Listing 
Private Sub UserForm_Initialize() 
    'List of Reports 
    With ListBox1 
     .AddItem "Report 1" 
     .AddItem "Report 2" 
     .AddItem "Report 3" 
     .AddItem "Report 4" 
     .AddItem "Report 5" 
     .AddItem "Report 6" 
    End With 
End Sub 

'Add selection to ListBox2 
Private Sub AddButton_Click() 

     With ListBox1 
     Dim itemIndex As Integer 
     For itemIndex = .ListCount - 1 To 0 Step -1 
      If .Selected(itemIndex) Then 
       ListBox2.AddItem .List(itemIndex) 
      End If 
     Next itemIndex 
    End With 

End Sub 

    'Double click to Add 
Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean) 
    ListBox2.AddItem ListBox1.List(ListBox1.ListIndex) 
End Sub 

回答

1

像這樣的東西希望能幫助你..

AddValueListbox2功能檢查值的存在,增加了它,如果它不存在,並提醒用戶,如果它是。

NB會如果你有多重選擇的列表框啓用工作。


Private Sub CommandButton1_Click() 

'index is -1 if nothin is selected 
If ListBox1.ListIndex = -1 Then Exit Sub 

'loop backwards as we're removing items 
For i = ListBox1.ListCount - 1 To 0 Step -1 

    If ListBox1.Selected(i) Then 

     AddValueListbox2 ListBox1.List(i) 
     ListBox1.RemoveItem (i) 

    End If 
Next i 

End Sub 


Private Function AddValueListbox2(str As String) 

Dim valExists As Boolean 

valExists = False 

    For i = 0 To ListBox2.ListCount - 1 

     If ListBox2.List(i) = str Then valExists = True 

    Next i 

    If valExists Then 

     MsgBox str & " has already been added to ListBox", vbInformation 

    Else 

     ListBox2.AddItem str 

    End If 

End Function 

Private Sub UserForm_Activate() 

Dim items(2) As String 

items(0) = "foo" 
items(1) = "bar" 
items(2) = "baz" 


    For i = LBound(items) To UBound(items) 
     Me.ListBox1.AddItem items(i) 
    Next i 

End Sub 
+0

謝謝山姆。您的代碼正在爲我工​​作。但是,我需要多選。那麼,現在,作爲一個臨時解決方案。我只需設置「添加」按鈕即可從列表框1中刪除項目,只要選擇添加到列表框2即可。這樣它將永遠不會再被選中。謝謝您的幫助。 – Yoko21

+0

它應該很容易適應多選框的工作,您只需循環選定的值並使用相同的邏輯即可。我不明白,但如果你從Listbox1中刪除該項目,那麼爲什麼你需要重複檢查? – Sam

+0

@ Yoko21我更新了代碼。它現在應該工作,如果ListBox1是多選。此外,該項目將被添加到listbox2時從ListBox1中刪除 – Sam

1

在任何人的情況下仍然有興趣,有另一種方式做到這一點,使用類似的技術。

Sub Duplicate() 

dim i as integer 
dim x as integer 
x = 0 

    For i = 0 to listbox2.count - 1 
    If listbox2.list(i) = myval Then 
     x = x + 1 
    End If 
    Next i 

    If x = 0 Then 
    listbox2.additem myval 
    End If 

End Sub 

其中,myval是從listbox1中選擇的值。

本質上,如果它在列表中找到對您的值的單個引用,它將啓動一個計數器。如果沒有找到您的值的實例,它會將其插入到列表框中。

希望這可以幫助別人。