Как искать в списке при вводе текста в текстовом поле с помощью VBA - PullRequest
0 голосов
/ 29 ноября 2018

Я использовал onKeyUp, поэтому, когда пользователь печатает, он ищет в представлении списка.Я получаю ошибку с моим кодом.

"Неверное количество аргументов или неправильное присвоение свойства"

Вот мой код ниже:

Private Sub txtEmailGenSearch_KeyUp(ByVal KeyCode As
    MSForms.ReturnInteger, ByVal Shift As Integer)
    Dim strText As String
    Dim i As Long

    strText = LCase(txtSearch.value)
    With MainForm.lstMailGen
        For i = 0 To .ListItems.count - 1
            If LCase(Left(.ListItems(i, 0), Len(strText))) = strText Then 
                Exit For

        Next i

        If i = .ListItems.count Then
            ' No matching item was found, select nothing
            .ListIndex = -1
        Else
            ' A match was found, select it
            .ListIndex = i
        End If
    End With
End Sub

1 Ответ

0 голосов
/ 29 ноября 2018

ListView довольно сильно отличается от ListBox.Каждая строка в ListView является ListItem.Если ListView имеет несколько столбцов, то каждый ListItem будет содержать ListSubItems.Это относится к Microsoft Windows Common Controls 6.0 Listview, 5.0 работает немного по-другому.ListViews не возвращают 2D-массив, как ListBox имеет свойство ListIndex.

Рекомендуемое чтение: Примеры элементов управления Excel VBA ListView

Использование ListItem.Find() для поискасоответствие ListItem

With MainForm.lstMailGen
    Dim item As ListItem
    Set item = .FindItem(sz:=txtSearch.value, fPartial:=lvwPartial)
    If Not item Is Nothing Then
        item.Selected = True
    End If
End With

Для того, чтобы ListItem был выделен, убедитесь, что HideSelection = False

MainForm.lstMailGen.HideSelection = False

Первый индекс Listitems1 не 0.

 For i = 1 To .ListItems.Count 
     If LCase(Left(.ListItems(i), Len(strText))) = strText Then 
        Exit For
 Next i

Если последний элемент содержит строку, чем If i = .ListItems.count Then, то выбор будет пропущен.If i > .ListItems.count Then это правильный способ сделать это.Если цикл For завершится, то i будет увеличен на дополнительное время.В приведенном выше случае i будет = .ListItems.Count + 1`, если цикл завершен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...