按字母顺序排列combobox值

我有一个excel的用户窗体中的combobox。 按字母顺序sorting的最简单方法是什么? 它的值在vba中是硬编码的,新的只是加到底部,所以它们已经没有任何顺序了。

目前正在使用用户表单,以便我们的用户可以将数据从我们的数据库导入到Excel中。 combobox在那里,所以他们可以指定要导入的客户端数据。

创build要sorting的数组并不像你想象的那么困难。 请参阅sorting多列表框 。 您可以将List属性放入Varianttypes中,将其作为数组sorting,然后将该Variant数组转储回List属性。 仍然不是很好,但这是最好的VBA。

在添加它们时,将它们与combobox中已有的值进行比较。 如果他们比你碰到的物品less,则更换物品。 如果它们不小于,则继续前进,直到find物品less于的物品。 如果找不到该项目,则将其添加到最后。

For X = 0 To COMBOBOX.ListCount - 1 COMBOBOX.ListIndex = X If NEWVALUE < COMBOBOX.Value Then COMBOBOX.AddItem (NEWVALUE), X GoTo SKIPHERE End If Next X COMBOBOX.AddItem (NEWVALUE) SKIPHERE: 

VBA没有内置的sortingfunction。 不幸。

一种不涉及自己实现/使用stream行的sortingalgorithm的便宜方法是通过COM使用.NET Framework的ArrayList类:

 Sub test() Dim l As Object Set l = CreateObject("System.Collections.ArrayList") ''# these would be the items from your combobox, obviously ''# ... add them with a for loop l.Add "d" l.Add "c" l.Add "b" l.Add "a" l.Sort ''# now clear your combobox Dim k As Variant For Each k In l ''# add the sorted items back to your combobox instead Debug.Print k Next k End Sub 

将此例程作为UserForm_Initialize一部分。 如果框架没有安装,这当然会失败。

这使用ADO库,我猜想将在大多数计算机上(Excel安装)。

Sub SortSomeData() Dim rstData As New ADODB.Recordset rstData.Fields.Append "Name", adVarChar, 40 rstData.Fields.Append "Age", adInteger rstData.Open rstData.AddNew rstData.Fields("Name") = "Kalpesh" rstData.Fields("Age") = 30 rstData.Update rstData.AddNew rstData.Fields("Name") = "Jon" rstData.Fields("Age") = 29 rstData.Update rstData.AddNew rstData.Fields("Name") = "praxeo" rstData.Fields("Age") = 1 rstData.Update MsgBox rstData.RecordCount Call printData(rstData) Debug.Print vbCrLf & "Name DESC" rstData.Sort = "Name DESC" Call printData(rstData) Debug.Print vbCrLf & "Name ASC" rstData.Sort = "Name ASC" Call printData(rstData) Debug.Print vbCrLf & "Age ASC" rstData.Sort = "Age ASC" Call printData(rstData) Debug.Print vbCrLf & "Age DESC" rstData.Sort = "Age DESC" Call printData(rstData) End Sub Sub printData(ByVal data As Recordset) Debug.Print data.GetString End Sub
Sub SortSomeData() Dim rstData As New ADODB.Recordset rstData.Fields.Append "Name", adVarChar, 40 rstData.Fields.Append "Age", adInteger rstData.Open rstData.AddNew rstData.Fields("Name") = "Kalpesh" rstData.Fields("Age") = 30 rstData.Update rstData.AddNew rstData.Fields("Name") = "Jon" rstData.Fields("Age") = 29 rstData.Update rstData.AddNew rstData.Fields("Name") = "praxeo" rstData.Fields("Age") = 1 rstData.Update MsgBox rstData.RecordCount Call printData(rstData) Debug.Print vbCrLf & "Name DESC" rstData.Sort = "Name DESC" Call printData(rstData) Debug.Print vbCrLf & "Name ASC" rstData.Sort = "Name ASC" Call printData(rstData) Debug.Print vbCrLf & "Age ASC" rstData.Sort = "Age ASC" Call printData(rstData) Debug.Print vbCrLf & "Age DESC" rstData.Sort = "Age DESC" Call printData(rstData) End Sub Sub printData(ByVal data As Recordset) Debug.Print data.GetString End Sub 

希望这给你足够的背景开始。
仅供参考 – 这是一个断开连接的logging集(内存表中更简单的.net数据集版本)。

它可以很容易地如下所示:

 Sub fill_combobox() Dim LastRow, a, b As Long, c As Variant ComboBox1.Clear LastRow = Sheets("S1").Cells(Rows.Count, 2).End(xlUp).Row For x = 2 To LastRow ComboBox1.AddItem Cells(x, 2).Value Next For a = 0 To ComboBox1.ListCount - 1 For b = a To ComboBox1.ListCount - 1 If ComboBox1.List(b) < ComboBox1.List(a) Then c = ComboBox1.List(a) ComboBox1.List(a) = ComboBox1.List(b) ComboBox1.List(b) = c End If Next Next End Sub 

我已经在这个模板中使用: 添加项目到Userform Combobox按字母顺序 enter image description here