Ms access Access中的MSForms.ListBox类型不匹配

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

我有一个Access数据库,我使用一个选项卡控件(不带选项卡)来模拟向导。其中一个选项卡页有一个名为lstPorts的MSForms.ListBox控件和一个名为cmdAdd的按钮,该按钮将文本框的内容添加到列表框中。然后,我尝试对列表框的内容进行排序。但是,对Sort方法的调用会导致类型不匹配

以下是cmdAdd_Click()代码:

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)。为什么要使用外部列表框控件?这对我来说似乎是一个重大的设计错误。我不明白为什么不能用常规的访问列表框来完成。这对我来说并不难。我不明白为什么不能用常规访问列表框来完成。对我来说这听起来并不难。