我有一个带有两个列表框的VBA用户窗体。我正在努力进行以下操作:
我需要检查Listbox1是否包含Listbox2中的列表项,如果包含,请删除Listbox1中包含Listbox2中项的项目。 例如,listbox1中的“紫色猴子”项包含“猴子”(listbox2中的项),因此我需要删除整个“紫色猴子”项。
有人可以帮我吗?
我使用以下代码创建主列表(关键字)并初始化用户窗体。另外,我创建了一个文本框,用户可以在其中输入项目并将它们添加到Listbox2中。这段代码效果很好:
Private Sub UserForm_Initialize()
Application.Visible = False
Keywords.SetFocus
TextBox2.Value = NegKeyList.ListCount & "negative keys"
Dim mycollection As Collection, cell As Range
On Error Resume Next
Set mycollection = New Collection
With Keywords
.Clear
For Each cell In Worksheets("Rawdata").Range("A3:A" & Cells(Rows.Count, 1).End(xlUp).Row)
If Len(cell) <> 0 Then
Err.Clear
mycollection.Add cell.Value, cell.Value
If Err.Number = 0 Then .AddItem cell.Value
End If
Next cell
End With
MsgBox mycollection.Count & "added to the list"
If Keywords.ListCount > 0 Then
TextBox1.Value = Keywords.ListCount & " keys"
End If
End Sub
我现在需要执行另一个功能,用户可以按下按钮并删除包含ListBox2项的所有关键字(不一定等于它们)。
答案 0 :(得分:4)
假设用户窗体上有一个命令按钮(CommandButton1),则可以将代码放在CommandButton1_Click()
事件中。由于某些项目可能会从ListBox1中删除,因此counter1
需要从最大值步进到最小值,以避免计数器产生的任何数组索引问题变得大于最大值。
Dim counter1 as Long
Dim counter2 as Long
For counter1 = ListBox1.ListCount - 1 to 0 Step -1 'Indexes are 0-based, so max index is count - 1
For counter2 = 0 to ListBox2.ListCount - 1
If InStr(1, ListBox1.List(counter1), ListBox2.List(counter2)) > 0 Then 'InStr returns 0 when there's no match
ListBox1.RemoveItem counter1
Exit For 'Skip any more compares for the deleted Item
End If
Next counter2
Next counter1