Ms access Access中的MSForms.ListBox类型不匹配
我有一个Access数据库,我使用一个选项卡控件(不带选项卡)来模拟向导。其中一个选项卡页有一个名为lstPorts的MSForms.ListBox控件和一个名为cmdAdd的按钮,该按钮将文本框的内容添加到列表框中。然后,我尝试对列表框的内容进行排序。但是,对Sort方法的调用会导致类型不匹配 以下是cmdAdd_Click()代码:Ms access Access中的MSForms.ListBox类型不匹配,ms-access,vba,Ms Access,Vba,我有一个Access数据库,我使用一个选项卡控件(不带选项卡)来模拟向导。其中一个选项卡页有一个名为lstPorts的MSForms.ListBox控件和一个名为cmdAdd的按钮,该按钮将文本框的内容添加到列表框中。然后,我尝试对列表框的内容进行排序。但是,对Sort方法的调用会导致类型不匹配 以下是cmdAdd_Click()代码: Private Sub cmdAdd_Click() Dim test As MSForms.ListBox lstPorts2.AddI
Private Sub cmdAdd_Click()
Dim test As MSForms.ListBox
lstPorts2.AddItem (txtPortName)
Call SortListBox(lstPorts2)
End Sub
以下是SortListBox子框:
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
有人帮忙吗?由于排序例程显式引用了MSForms.ListBox,因此来自Google的大多数结果都不适用
Jason检查lstPorts2的类型:
Debug.Print "TypeName(lstPorts2): " & TypeName(lstPorts2)
您的描述听起来像lstPorts2实际上可能是一个访问列表框,而不是一个MSForms.listbox。。。这些是不同的对象类型。例如,Access列表框没有排序例程中使用的Clear方法
也许您可以转换为Access listbox,并让SortListBox对所有listbox成员使用RemoveItem方法来替代Clear
编辑:我不确定MSForms.ListBox的TypeName会是什么,所以我可能在这里不正确。尽管如此,我还是会打开表单模块,键入Me.lstPorts2.,查看IntelliSense是否提供Clear作为方法/属性之一
我和MSForms的关系不稳定。能否将lstPorts2改为访问列表框?如果是这样的话,我认为将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为“值列表”的访问列表框可能更简单:
oLb.RowSource = ""
检查lstPorts2的类型:
Debug.Print "TypeName(lstPorts2): " & TypeName(lstPorts2)
您的描述听起来像lstPorts2实际上可能是一个访问列表框,而不是一个MSForms.listbox。。。这些是不同的对象类型。例如,Access列表框没有排序例程中使用的Clear方法
也许您可以转换为Access listbox,并让SortListBox对所有listbox成员使用RemoveItem方法来替代Clear
编辑:我不确定MSForms.ListBox的TypeName会是什么,所以我可能在这里不正确。尽管如此,我还是会打开表单模块,键入Me.lstPorts2.,查看IntelliSense是否提供Clear作为方法/属性之一
我和MSForms的关系不稳定。能否将lstPorts2改为访问列表框?如果是这样的话,我认为将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为“值列表”的访问列表框可能更简单:
oLb.RowSource = ""
我想切换回常规列表框是可行的 我想使用MSForms one,因为该列表框将填充现有数据,但用户可以添加新数据。用户添加的任何内容的id都将为-1,然后所有新的都将很容易识别
哦,好吧。我非常感谢您的帮助。我想切换回常规列表框是可行的 我想使用MSForms one,因为该列表框将填充现有数据,但用户可以添加新数据。用户添加的任何内容的id都将为-1,然后所有新的都将很容易识别
哦,好吧。非常感谢您的帮助。很有趣。Debug.Print的结果是TypeName(lstPorts2):CustomControl我应该期望它以MSForms.ListBox的形式出现吗?IntelliSense没有提供Clear作为选项,所以我猜lsports只是一个通用对象(如果我可以使用真正的语言,我会转换为我需要的任何对象)。有趣。Debug.Print的结果是TypeName(lstPorts2):CustomControl我应该期望它以MSForms.ListBox的形式出现吗?IntelliSense没有提供Clear作为选项,所以我猜lsports只是一个通用对象(如果我可以使用真正的语言,我会强制转换为我需要的任何对象)。类似于“lstPorts2.AddItem(txtPortName)”的代码马虎而危险。应该指定父窗体,即Me!lstPorts2.AddItem(MetxtPortName)或Me.lstPorts2.AddItem(Me.txtPortName)。为什么要使用外部列表框控件?对我来说,这似乎是一个主要的设计错误。像这样的代码“lstPorts2.AddItem(txtPortName)”是草率和危险的。应该指定父窗体,即Me!lstPorts2.AddItem(MetxtPortName)或Me.lstPorts2.AddItem(Me.txtPortName)。为什么要使用外部列表框控件?这对我来说似乎是一个重大的设计错误。我不明白为什么不能用常规的访问列表框来完成。这对我来说并不难。我不明白为什么不能用常规访问列表框来完成。对我来说这听起来并不难。