我在excel的userform中有一个组合框。按字母顺序排序的最简单方法是什么?它的值在vba中是硬编码的,而新的值只是添加到底部,所以它们不是任何顺序。
当前正在使用userform,以便我们的用户可以将数据从我们的数据库导入excel。组合框就在那里,因此他们可以指定要导入的客户端数据。
答案 0 :(得分:2)
创建要排序的数组并不像你想象的那么难。见Sorting Mulicolumn Listbox。您可以将List属性放入Variant类型,将其排序为数组,并将Variant Array转储回List属性。仍然不是很好,但它是最好的VBA。
答案 1 :(得分:2)
在添加它们时,将它们与组合框中已有的值进行比较。 如果它们小于您遇到的项目,则替换该项目。 如果它们不小于,则继续前进,直到找到项目小于的内容。 如果找不到该项,则将其添加到最后。
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:
答案 2 :(得分:2)
可以很容易地如下:
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组合框中 enter image description here
答案 3 :(得分:1)
VBA缺乏针对此类内容的内置排序功能。不幸的是
一种不涉及实现/使用其中一种流行排序算法的廉价方法是通过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
的一部分。如果没有安装框架,这当然会失败。
答案 4 :(得分:1)
这使用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
希望这能为您提供足够的背景知识 仅供参考 - 这是一个断开连接的记录集(内存表中简化版的.net数据集)。