2013-03-21 13 views
6

Zastanawiam się, jak posortować wartości w combobox.Sortuj Combobox VBA

Dodaję elementy do ComboBox, gdy inicjalizuję formularz, ponieważ liczba wartości stale rośnie na arkuszu.

używam następny kod, aby dodać elementy:

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 

Myślałem skopiować wartości, które mam zamiar dodać na ComoBox do innego arkusza i tam sortować je w nowej karcie, to działa dobrze, ale nie wydaje się być inteligentną opcją, co oznacza, że ​​tworzę kolejny arkusz, a następnie kopiuję wartości i sortuję je zamiast sortować je bezpośrednio.

Moje pytanie brzmi, czy ktoś wie, jak to zrobić bezpośrednio z oryginalnego arkusza? Nie znam się na API, więc proszę, tylko kod VBA. Sprawdzam na MSDN, ale nie wiem, jak to zrobić.

Dzięki, a jeśli potrzebujesz więcej informacji, proszę, daj mi znać.

PS: Nie mogę sortować je bezpośrednio z oryginalnego arkusza ponieważ ta karta się ze statycznym celu

Odpowiedz

3

można przeczytać wartości z arkusza do tablicy, posortuj to za pomocą kodu, a następnie dodaj elementy.

Ten kod będzie to zrobić, używając 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 
+0

dziękuję, pozwól mi spojrzeć, a ja przyjmuję odpowiedź – themolestones

+2

Nie potrzebujesz zapętlić. Możesz użyć 'Me.ComboBox1.List = varRange' –

+0

@DickKusleika: Dobrze, zaktualizowałem kod. –

0

Try poniżej kodu:

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

I nie sądzę, że woli sortuj dane ... –

1

To zależy od okoliczności, rodzaju i struktury danych . Ale wolę to zrobić w ten sposób:
Można alternatywnie używać tablicy i sortowanie bąbelkowe algo :)
zmodyfikować kod trochę do własnych sprawa

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

do sortowania 123 dla numeru

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 

do sortowania abcd tekstu

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