Несоответствие типов в MSForms.ListBox в Access - PullRequest
1 голос
/ 02 июня 2010

У меня есть база данных Access, где я использую элемент управления Tab (без вкладок) для имитации мастера. На одной из вкладок есть элемент управления MSForms.ListBox с именем lstPorts и кнопка с именем 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 не применимо.

Jason

Ответы [ 2 ]

3 голосов
/ 02 июня 2010

Проверьте тип lstPorts2:

Debug.Print "TypeName(lstPorts2): " & TypeName(lstPorts2)

Ваше описание звучит так, будто lstPorts2 может быть списком Access, а не MSForms.ListBox ... и это разные типы объектов. Например, в списке доступа отсутствует метод Clear , который вы используете в своей процедуре сортировки.

Возможно, вы могли бы преобразовать в список доступа и использовать SortListBox, используя метод RemoveItem для всех членов списка вместо Очистить .

Редактировать : Я не уверен, что TypeName скажет для MSForms.ListBox, так что я могу быть здесь не по назначению. Тем не менее, я бы открыл модуль формы, набрав 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 = ""
1 голос
/ 02 июня 2010

Я думаю, что переключение обратно на обычный ListBox сработало.

Я хотел использовать MSForms, поскольку этот список будет заполнен существующими данными, но пользователь сможет добавлять новые данные. Все, что добавил пользователь, будет иметь идентификатор -1, и тогда все новые будут легко идентифицируемы.

Ну хорошо. Я очень ценю помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...