我有一个Access数据库,我使用Tab控件(没有制表符)来模拟向导。其中一个标签页有一个名为lstPorts的MSForms.ListBox控件和一个名为cmdAdd的按钮,它将文本框的内容添加到列表框中。然后我尝试保持ListBox的内容排序。但是,对Sort方法的调用会导致类型不匹配。
这是后面的cmdAdd_Click()代码:
Private Sub cmdAdd_Click()
Dim test As MSForms.ListBox
lstPorts2.AddItem (txtPortName)
Call SortListBox(lstPorts2)
End Sub
这是SortListBox Sub:
Public Sub SortListBox(ByRef oLb As MSForms.ListBox)
Dim vaItems As Variant
Dim i As Long, j As Long
Dim vTemp As Variant
'Put the items in a variant array
vaItems = oLb.List
For i = LBound(vaItems, 1) To UBound(vaItems, 1) - 1
For j = i + 1 To UBound(vaItems, 1)
If vaItems(i, 0) > vaItems(j, 0) Then
vTemp = vaItems(i, 0)
vaItems(i, 0) = vaItems(j, 0)
vaItems(j, 0) = vTemp
End If
Next j
Next i
'Clear the listbox
oLb.Clear
'Add the sorted array back to the listbox
For i = LBound(vaItems, 1) To UBound(vaItems, 1)
oLb.AddItem vaItems(i, 0)
Next i
End Sub
那里有任何帮助吗?由于Sort例程显式引用了MSForms.ListBox,因此Google的大多数结果都不适用。
杰森
答案 0 :(得分:3)
检查lstPorts2的类型:
Debug.Print "TypeName(lstPorts2): " & TypeName(lstPorts2)
您的描述听起来像lstPorts2实际上可能是Access列表框而不是MSForms.ListBox ......并且这些是不同的对象类型。例如,Access列表框没有您在排序例程中使用的 Clear 方法。
也许您可以转换为Access列表框,让SortListBox使用 RemoveItem 方法为所有列表框成员替代 Clear 。
编辑:我不确定TypeName会对MSForms.ListBox说什么,所以我可能会离开这里。我仍然打开表单模块,键入 Me.lstPorts2。,看看IntelliSense是否提供 Clear 作为方法/属性之一。
我与MSForms的关系不稳定。你能将lstPorts2改为Access列表框吗?如果是这样,我认为修改SortListBox可能会起作用:
Public Sub SortListBox(ByRef oLb As ListBox)
Dim vaItems As Variant
Dim i As Long, j As Long
Dim vTemp As Variant
'Put the items in a variant array '
vaItems = Split(oLb.RowSource, ";")
For i = LBound(vaItems, 1) To UBound(vaItems, 1) - 1
For j = i + 1 To UBound(vaItems, 1)
If vaItems(i, 0) > vaItems(j, 0) Then
vTemp = vaItems(i, 0)
vaItems(i, 0) = vaItems(j, 0)
vaItems(j, 0) = vTemp
End If
Next j
Next i
'Clear the listbox '
For i = (oLb.ListCount - 1) To 0 Step -1
oLb.RemoveItem (i)
Next i
'Add the sorted array back to the listbox '
For i = LBound(vaItems, 1) To UBound(vaItems, 1)
oLb.AddItem vaItems(i, 0)
Next i
End Sub
实际上,清除RowSourceType为“值列表”的Access列表框可能更简单:
oLb.RowSource = ""
答案 1 :(得分:1)
我想切换回常规的ListBox工作。
我之前想要使用MSForms,因为该列表框将填充现有数据,但用户可以添加新数据。用户添加的任何内容的id都为-1,然后所有新的内容都很容易识别。
好吧,好吧。我非常感谢你的帮助。