2013-03-21 59 views
6

我一直在想如何對組合框中的值進行排序。Sort Combobox VBA

當我初始化表單時,我將項目添加到組合框,因爲值的數量在表單上不斷增加。

我用下面的代碼添加項目:

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添加到另一個工作表,並有對它們進行排序的值,它的工作原理很好,但它似乎不是一個明智的選擇,這意味着我創建另一個工作表,然後複製值並對其進行排序,而不是直接對它們進行排序。

我的問題是,任何人都知道如何直接從原始表單中進行操作?我不知道API的任何內容,因此請僅使用VBA代碼。我試圖檢查MSDN,但我無法弄清楚如何使其工作。

謝謝,如果需要更多信息,請告訴我。

PS:我不能直接從原始片,因爲這個表必須是一個靜態順序

回答

3

你可以閱讀將表格中的值存入數組,然後用代碼對其進行排序,然後添加項目。

此代碼將做到這一點,利用快速排序:

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 
+0

謝謝,讓我看看,我會接受的答案 – themolestones 2013-03-21 10:27:16

+2

你不需要循環。你可以使用'Me.ComboBox1.List = varRange' – 2013-03-21 12:51:56

+0

@DickKusleika:好點,我更新了代碼。 – 2013-03-21 13:02:15

0

嘗試下面碼對它們進行排序:

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 
+0

我不認爲這會排序數據... – 2013-03-21 09:27:42

1

這取決於情況,數據的類型和結構。但我更願意做這種方式:
你可以選擇使用一個陣列和冒泡排序算法中:)
修改代碼一點,以滿足您的情況

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 
0

排序123號

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 

排序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