我使用了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
答案 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`。