VBA-Сортировка данных в списке, сортировка работает, но данные в списке не изменены - PullRequest
2 голосов
/ 06 декабря 2008

Список передается, данные помещаются в массив, массив сортируется, а затем данные помещаются обратно в список. Часть, которая работает, помещает данные обратно в список. Это как список передается по значению, а не по ссылке.

Вот подпрограмма, которая выполняет сортировку, и строка кода, которая вызывает подпрограмму сортировки.

Private Sub SortListBox(ByRef LB As MSForms.ListBox)

Dim First As Integer
Dim Last As Integer
Dim NumItems As Integer
Dim i As Integer
Dim j As Integer
Dim Temp As String
Dim TempArray() As Variant

ReDim TempArray(LB.ListCount)

First = LBound(TempArray)               ' this works correctly
Last = UBound(TempArray) - 1            ' this works correctly

For i = First To Last
    TempArray(i) = LB.List(i)           ' this works correctly
Next i

For i = First To Last
    For j = i + 1 To Last
        If TempArray(i) > TempArray(j) Then
            Temp = TempArray(j)
            TempArray(j) = TempArray(i)
            TempArray(i) = Temp
        End If
    Next j
Next i                               ! data is now sorted

LB.Clear                             ! this doesn't clear the items in the listbox

For i = First To Last
    LB.AddItem TempArray(i)          ! this doesn't work either
Next i

End Sub

Private Sub InitializeForm()

'   There's code here to put data in the list box    

Call SortListBox(FieldSelect.CompleteList)

End Sub

Спасибо за вашу помощь.

Ответы [ 3 ]

1 голос
/ 06 декабря 2008

Вы не можете передавать объекты по значению. Поскольку вы не собираетесь возвращать вызывающему абоненту другой экземпляр списка, вам следует объявить LP как ByVal. Это не влияет на код, хотя. Это работает, и список сортируется. Я думаю, что вы пропустили некоторые важные детали.

0 голосов
/ 02 ноября 2009

Я не знаю, сработает ли это для вас, но попробуйте это так.

Сначала создайте массив всех элементов в списке

Передайте этот массив вашей функции

Сортировать этот массив

вернуть массив в основную программу

очистить список

перезаписать элементы списка новым массивом

0 голосов
/ 19 января 2009

Это работает для меня в Excel 2003 на очень простой пользовательской форме с одним ListBox с именем ListBox1:

Private Sub UserForm_Initialize()

ListBox1.AddItem "john"
ListBox1.AddItem "paul"
ListBox1.AddItem "george"
ListBox1.AddItem "ringo"

SortListBox ListBox1

End Sub

и затем ваш SortListBox, как написано, кроме исправления трех комментариев, которые начинаются с! а не '

Единственным отличием вашего инициализатора является имя (UserForm_Initialize против InitializeForm). Обязательно используйте селекторы объектов и событий в верхней части кодовой страницы для пользовательской формы, чтобы гарантировать правильное имя обработчиков событий

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