2013-03-21 2 views
6

Я думал о том, как сортировать значения в combobox.Сортировка Combobox VBA

Я добавляю элементы в 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 на другой лист и там сортировать их в новом листе, он работает но это не похоже на умный вариант, а это значит, что я создаю другой лист, а затем копирую значения и сортирую их, а не сортируя их напрямую.

Мой вопрос: кто знает, как это сделать непосредственно с оригинального листа? Я не знаю ничего об API, поэтому, пожалуйста, только код VBA. Я проверяю MSDN, но не могу понять, как заставить его работать.

Спасибо, и если вам нужна дополнительная информация, пожалуйста, сообщите мне об этом.

PS: Я не могу сортировать их непосредственно из исходного листа, поскольку этот лист должен быть статическим порядка

ответ

3

Вы можете прочитать значения из листа в массив, отсортируйте его с помощью кода и затем добавьте элементы.

Этот код будет делать это, используя 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

спасибо, позвольте мне взглянуть, и я приму ответ – themolestones

+2

Вам не нужен к петле. Вы можете использовать 'Me.ComboBox1.List = varRange' –

+0

@DickKusleika: Хорошо, я обновил код. –

0

Try ниже код:

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

Я не думаю, что будет сортировать данные ... –

1

Это зависит от обстоятельств, типа и структуры данных , Но я предпочитаю, чтобы сделать это таким образом:
Вы можете альтернативно использовать массив и пузырьковую сортировку Algo :)
изменить код немного, чтобы удовлетворить ваше дело

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 

для сортировки текста абвг

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 
Смежные вопросы