使用VBA在文本框中键入文字时如何在ListView中搜索

时间:2018-11-29 12:47:51

标签: excel vba excel-vba

我使用了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 :(得分:1)

ListView与ListBox完全不同。 ListView中的每一行都是一个ListItem。如果ListView具有多个列,则每个ListItem将包含ListSubItems。这适用于Microsoft Windows Common Controls 6.0 Listview,5.0的工作原理略有不同。 ListViews不会像ListBox具有ListIndex属性那样返回2D数组。

推荐读物:Excel VBA ListView Control Examples

使用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

Listitems的第一个索引是1而不是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`。