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

时间:2009-05-13 20:52:36

标签: excel vba sorting excel-vba

我在excel的userform中有一个组合框。按字母顺序排序的最简单方法是什么?它的值在vba中是硬编码的,而新的值只是添加到底部,所以它们不是任何顺序。

当前正在使用userform,以便我们的用户可以将数据从我们的数据库导入excel。组合框就在那里,因此他们可以指定要导入的客户端数据。

5 个答案:

答案 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数据集)。