传递一个列表框,数据放在一个数组中,数组是排序,然后数据放回到列表框中。有效的部分是将数据放回列表框中。就像列表框通过值而不是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
感谢您的帮助。
答案 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)
我不知道这对你有用,但是这样试试。
首先,创建列表框中所有项目的数组
将该数组传递给您的函数
对该数组进行排序
将数组返回主程序
清除列表框
使用新数组
覆盖列表框项目