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

3

我在Excel的用户窗体中有一个组合框。最简单的方法是按字母顺序对它进行排序吗?它的值是在VBA中硬编码的,并且新的值只是添加到底部,因此它们没有任何已排序的方式。

目前正在使用用户窗体,以便我们的用户可以将数据从我们的数据库导入Excel。组合框存在是为了让他们指定要导入的客户数据。


这是一个字段和/或表的列表吗?您是否考虑使用数据库模式来填充列表框,而不是硬编码列表? - Fionnuala
这是一个很好的观点,因为列表可能已经按照我的要求预先排序了。我能看到的唯一问题是安全性和性能问题。感谢您的建议。 - praxeo
5个回答

3
当你往组合框中添加项目时,要将它们与已经存在的值进行比较。如果它们小于你遇到的项目,则替换该项目。如果它们不小于,则继续查找,直到找到某个项目小于该项为止。如果未找到该项,则将其添加到末尾。
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:

3
它可以很容易地如下所示:
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

我在这个模板中使用了:按字母顺序排序组合框 输入图像描述

2
创建需要排序的数组并不像你想象中那么难。请参见多列列表框的排序。你可以将List属性直接放入Variant类型中,将其作为数组进行排序,然后将该Variant数组转储回List属性中。虽然不是最好的方法,但这是VBA所拥有的最佳方法。

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的一部分。当然,如果框架没有安装,这将失败。

感谢您的回答。然而,这是作为其他人计算机上的Excel插件实现的,虽然我有.NET框架,但无法确定他们是否有它。 - praxeo
是的。在这种情况下,您必须使用为VBA提供的众多排序解决方案之一。以下是我通过Google找到的一个随机解决方案,使用堆排序:http://www.source-code.biz/snippets/vbasic/1.htm - Tomalak
尽管对于一些组合框项目而言,可能一个最小化的冒泡排序也不会完全影响性能,而且代码量更少。 - Tomalak
1
是啊,我觉得有点荒谬,我必须先构建一个数组来排序,然后再构建一个排序函数,最后将其添加到组合框中,哈哈。我以为可能有一个内置函数或类似的东西。也许更容易的方法是将值插入到 Excel 表格中,在插件中对它们进行排序,然后再将值插入。我不知道是否想要重新发明轮子。 - praxeo

1

这个程序使用ADO库,我猜想大多数电脑上都会有(安装了Excel的话)。

子程序SortSomeData() Dim rstData As New ADODB.Recordset rstData.Fields.Append“名称”,adVarChar,40 rstData.Fields.Append“年龄”,adInteger rstData.Open
rstData.AddNew rstData.Fields(“名称”)=“Kalpesh” rstData.Fields(“年龄”)= 30 rstData.Update rstData.AddNew rstData.Fields(“名称”)=“Jon” rstData.Fields(“年龄”)= 29 rstData.Update rstData.AddNew rstData.Fields(“名称”)=“praxeo” rstData.Fields(“年龄”)= 1 rstData.Update MsgBox rstData.RecordCount Call printData(rstData)
Debug.Print vbCrLf&“名称DESC” rstData.Sort =“名称DESC” Call printData(rstData)
Debug.Print vbCrLf&“名称ASC” rstData.Sort =“名称ASC” Call printData(rstData)
Debug.Print vbCrLf&“年龄ASC” rstData.Sort =“年龄ASC” Call printData(rstData)
Debug.Print vbCrLf&“年龄DESC” rstData.Sort =“年龄DESC” Call printData(rstData) End Sub
子程序printData(ByVal data As Recordset) Debug.Print data.GetString End Sub
希望这能为您提供足够的背景知识以便开始。
FYI - 这是一个断开的记录集(内存表的简化版本,不同于 .net 数据集)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接