MSForms.ListBox类型在Access中不匹配

时间:2010-06-02 15:14:50

标签: ms-access vba

我有一个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的大多数结果都不适用。

杰森

2 个答案:

答案 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,然后所有新的内容都很容易识别。

好吧,好吧。我非常感谢你的帮助。