Проверьте тип 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 = ""