排序Combobox VBA

the*_*nes 6 sorting excel vba combobox excel-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
Run Code Online (Sandbox Code Playgroud)

我想将我要添加到ComoBox上的值复制到另一张表并在新表中对它们进行排序,它工作正常但它似乎不是一个聪明的选项,这意味着我创建了另一张表然后复制值并对其进行排序,而不是直接对它们进行排序.

我的问题是,任何人都知道如何直接从原始表格中做到这一点?我不知道任何API,所以,请,只有VBA代码.我alredy检查MSDN但我无法弄清楚如何使其工作.

谢谢,如果需要更多信息,请告诉我.

PS:我无法直接从原始工作表中对它们进行排序,因为此工作表必须具有静态顺序

Pet*_*ert 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
Run Code Online (Sandbox Code Playgroud)

  • 你不需要循环。您可以使用`Me.ComboBox1.List = varRange` (2认同)