VBA-对列表框中的数据进行排序,排序有效但列表框中的数据未更改

时间:2008-12-05 22:01:34

标签: excel-vba vba excel

传递一个列表框,数据放在一个数组中,数组是排序,然后数据放回到列表框中。有效的部分是将数据放回列表框中。就像列表框通过值而不是ref传递一样。

这是执行排序的子和调用sort子的代码行。

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 个答案:

答案 0 :(得分:1)

您无法按值传递对象。由于您不打算将另一个listbox实例返回给调用者,因此您应该将LP声明为ByVal。但这并不影响代码。它工作,列表排序。我想你省略了一些重要的细节。

答案 1 :(得分:0)

这适用于我在Excel 2003上的一个非常基本的UserForm,它有一个名为ListBox1的ListBox:

Private Sub UserForm_Initialize()

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

SortListBox ListBox1

End Sub

然后你的SortListBox除了修复三个注释开始之外!而不是'

与初始值设定项的唯一区别是名称(UserForm_Initialize vs InitializeForm)。确保在代码页顶部使用userform的对象和事件选择器,以确保事件处理程序正确命名

答案 2 :(得分:0)

我不知道这对你有用,但是这样试试。

首先,创建列表框中所有项目的数组

将该数组传递给您的函数

对该数组进行排序

将数组返回主程序

清除列表框

使用新数组

覆盖列表框项目