sortingCombobox VBA

我一直在想如何sortingcombobox中的值。

当我初始化表单时,我将项目添加到combobox中,因为值的数量在表单上不断增加。

我使用下一个代码来添加项目:

With ComboBox1 lastcell = ThisWorkbook.Sheets("1").Range("F1000000").End(xlUp).Row + 1 For i = 2 To lastcell .AddItem ThisWorkbook.Sheets("1").Cells(i, 6) Next i End With 

我想复制我将添加到另一个工作表的ComoBox的值,并在那里sorting他们在新工作表,它工作正常,但它似乎不是一个明智的select,这意味着我创build另一个工作表,然后复制值并对其进行sorting,而不是直接对它们进行sorting。

我的问题是,任何人都知道如何直接从原始表单中进行操作? 所以,我不知道任何API,只有VBA代码。 我试图检查MSDN,但我不知道如何使其工作。

谢谢,如果需要更多的信息,请让我知道。

PS:我不能直接从原始表中sorting,因为这张表必须是静态订单

您可以将表格中的值读入数组,然后用代码对其进行sorting,然后添加项目。

此代码将使用Quicksort完成此操作:

 Private Sub UserForm_Initialize() Dim varRange() As Variant Dim lngLastRow As Long Dim i As Long lngLastRow = Range("F:F").Find(What:="*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row varRange = Range("F:F").Resize(lngLastRow).Cells subQuickSort varRange Me.ComboBox1.List = varRange End Sub Public Sub subQuickSort(var1 As Variant, _ Optional ByVal lngLowStart As Long = -1, _ Optional ByVal lngHighStart As Long = -1) Dim varPivot As Variant Dim lngLow As Long Dim lngHigh As Long lngLowStart = IIf(lngLowStart = -1, LBound(var1), lngLowStart) lngHighStart = IIf(lngHighStart = -1, UBound(var1), lngHighStart) lngLow = lngLowStart lngHigh = lngHighStart varPivot = var1((lngLowStart + lngHighStart) \ 2, 1) While (lngLow <= lngHigh) While (var1(lngLow, 1) < varPivot And lngLow < lngHighStart) lngLow = lngLow + 1 Wend While (varPivot < var1(lngHigh, 1) And lngHigh > lngLowStart) lngHigh = lngHigh - 1 Wend If (lngLow <= lngHigh) Then subSwap var1, lngLow, lngHigh lngLow = lngLow + 1 lngHigh = lngHigh - 1 End If Wend If (lngLowStart < lngHigh) Then subQuickSort var1, lngLowStart, lngHigh End If If (lngLow < lngHighStart) Then subQuickSort var1, lngLow, lngHighStart End If End Sub Private Sub subSwap(var As Variant, lngItem1 As Long, lngItem2 As Long) Dim varTemp As Variant varTemp = var(lngItem1, 1) var(lngItem1, 1) = var(lngItem2, 1) var(lngItem2, 1) = varTemp End Sub 

这取决于数据的情况,types和结构。 但我更喜欢这样做:
你也可以使用一个数组和一个冒泡sortingalgorithm:)
修改一下代码以适应你的情况

 Option Explicit Sub WITH_COMBOBOX() Dim i As Long Dim arr() As String Dim lastCell As Long lastCell = 500 ReDim arr(lastCell) Call FillAndSortArray(arr) For i = 2 To lastCell .AddItem arr(i - 2) Next i End Sub Sub FillAndSortArray(ByRef myArray() As String) Dim i As Long For i = LBound(myArray) To UBound(myArray) myArray(i) = CStr(ThisWorkbook.Sheets(1).Range("F" & i + 2).Value) Next i Call BubbleSort(myArray) End Sub Sub BubbleSort(ByRef myArray() As String) Dim i As Long, j As Long Dim Temp As String For i = LBound(myArray) To UBound(myArray) - 1 For j = i + 1 To UBound(myArray) - 1 If myArray(i) > myArray(j) Then Temp = myArray(j) myArray(j) = myArray(i) myArray(i) = Temp End If Next j Next i End Sub 

尝试下面的代码:

 Sub GetAction() Dim rng As Range, lastcell As Long lastcell = Range("F1000").End(xlUp).Row + 1 Set rng = Range("F1:F" & lastcell) ' assuming to start from F1 If Not rng Is Nothing Then rng.Sort Range("F1") ComboBox1.ListFillRange = rng.Address End If End Sub 

用于sorting123的号码

 For Each cell In ThisWorkbook.Sheets("sheet1").Range("list1") Me.ComboBox1.AddItem cell Next cell With Me.ComboBox1 For x = LBound(.list) To UBound(.list) For y = x To UBound(.list) If .list(y, 0) + 0 < .list(x, 0) + 0 Then blah = .list(y, 0) .list(y, 0) = .list(x, 0) .list(x, 0) = blah End If Next y Next x End With 

用于sorting文本abcd

 For Each cell In ThisWorkbook.Sheets("sheet1").Range("list1") Me.ComboBox1.AddItem cell Next cell With Me.ComboBox1 For x = LBound(.list) To UBound(.list) For y = x To UBound(.list) If .list(y, 0) < .list(x, 0) Then blah = .list(y, 0) .list(y, 0) = .list(x, 0) .list(x, 0) = blah End If Next y Next x End With