按字母顺序对组合框进行排序VBA Excel

时间:2019-01-02 16:40:13

标签: excel vba excel-vba sorting combobox

我正在用vba Excel扩展一个小型程序。我的Comboxbox由Excel工作表填充。我想构建一些控件,例如“添加/删除项目”,以将其他项目添加到我的组合框中,这就是为什么我需要知道组合框中每个项目的行号的原因。我的代码可以执行此操作,但我仍然不知道如何在将项目添加到组合框之前按字母顺序对项目进行排序(请参见下面的代码),您能帮忙吗?预先感谢

Sub Fill_EightD_D1_CB1() With EightD.EightD_D1_CB1 .ColumnCount = 2 ' 2 colonnes .ColumnWidths = "-1;0" ' dont une de masquée End With Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets("D1") Dim LC As Long Dim i As Long LC = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row For i = 2 To LC If ws.Cells(i, 1) <> "" Then EightD.EightD_D1_CB1.AddItem ws.Cells(i, 1).Value EightD.EightD_D1_CB1.List(EightD.EightD_D1_CB1.ListCount - 1, 1) = Mid(ws.Cells(i, 1).Address(False, False), 2, 1) End If Next i 'show always the first element EightD.EightD_D1_CB1.ListIndex = 0 'Bold Text EightD_D1_CB1 EightD.EightD_D1_CB1.Font.Bold = True End Sub

2 个答案:

答案 0 :(得分:1)

使用支持排序的数据结构来首先捕获数据,对数据进行排序,然后将其添加到列表框中。我已经展示了如何在下面的代码中添加和排序。

Sub SortAnArrayList()
    Dim ArrayList As Object
    Dim ArrayItem As Variant

    Set ArrayList = CreateObject("System.Collections.ArrayList")

    With ArrayList
        .Add "b"
        .Add "c"
        .Add "a"
        .Sort
    End With

    For Each ArrayItem In ArrayList
        Debug.Print ArrayItem
    Next

End Sub

答案 1 :(得分:1)

尝试

Sub Fill_EightD_D1_CB1()

    With EightD.EightD_D1_CB1
        .ColumnCount = 2        ' 2 colonnes
        .ColumnWidths = "-1;0"  ' dont une de masquee

    End With
    Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets("D1")
    Dim LC As Long
    Dim i As Long, r As Long, j As Long
    Dim vDB As Variant, vR(), vtemp(1 To 2)

    LC = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
    vDB = ws.Range("a2", "a" & LC)
    r = UBound(vDB, 1)
    ReDim vR(1 To r, 1 To 2)
    For i = 1 To r
        vR(i, 1) = vDB(i, 1)
        vR(i, 2) = i + 1
    Next i
    For i = 1 To r
        For j = 1 To r
            If vR(i, 1) < vR(j, 1) Then
                vtemp(1) = vR(i, 1)
                vtemp(2) = vR(i, 2)
                vR(i, 1) = vR(j, 1)
                vR(i, 2) = vR(j, 2)
                vR(j, 1) = vtemp(1)
                vR(j, 2) = vtemp(2)
            End If
        Next j
    Next i
    EightD.EightD_D1_CB1.List = vR
    'show always the first element
    EightD.EightD_D1_CB1.ListIndex = 0
    'Bold Text EightD_D1_CB1
    EightD.EightD_D1_CB1.Font.Bold = True
End Sub