Listbox1包含listbox2->删除项目中的文本

时间:2018-09-24 16:39:15

标签: excel vba excel-vba listbox userform

我有一个带有两个列表框的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项的所有关键字(不一定等于它们)。

1 个答案:

答案 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