Listbox1 Содержит текст из listbox2-> удалить элемент - PullRequest
0 голосов
/ 24 сентября 2018

У меня есть пользовательская форма VBA с двумя списками.Я изо всех сил пытаюсь сделать следующую операцию:

Мне нужно проверить, содержит ли Listbox1 элементы списка из Listbox2, и если это так, удалите элементы в Listbox1, которые содержат элементы из Listbox2.Например, элемент "пурпурная обезьяна" в списке1 содержит "обезьяну" (элемент в списке 2), поэтому мне нужно удалить весь элемент "фиолетовая обезьяна". ​​

Может ли кто-нибудь помочь мне с этим?

Я использую следующий код для создания первичного списка (Ключевые слова) и инициализации пользовательской формы.Кроме того, я создаю текстовое поле, в которое пользователь вводит элементы, и они добавляются в 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 голосов
/ 24 сентября 2018

Предполагая, что у вас есть командная кнопка (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
...