【问题标题】:Sort combobox values alphabetically按字母顺序对组合框值进行排序
【发布时间】:2010-10-26 00:17:54
【问题描述】:

我在 Excel 用户表单中有一个组合框。按字母顺序排序的最简单方法是什么?它的值在 vba 中是硬编码的,新的值只是添加到底部,因此它们已经没有任何顺序。

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

【问题讨论】:

  • 这是字段和/或表格的列表吗?您是否考虑过使用数据库架构来填充列表框,而不是硬编码列表?
  • 这是一个很好的观点,因为列表可能会以任何方式预先排序。我能看到的唯一问题是安全和性能问题。感谢您的建议。

标签: vba sorting excel


【解决方案1】:

在添加它们时,将它们与组合框中已有的值进行比较。 如果它们小于您遇到的项目,请更换该项目。 如果它们不小于,则继续前进,直到找到该项目小于的东西。 如果找不到该项目,则将其添加到末尾。

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】:

    很容易如下:

    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
    

    我在这个模板中使用过:Sort combobox alphabetically

    【讨论】:

      【解决方案3】:

      创建要排序的数组并不像您想象的那么难。见Sorting Mulicolumn Listbox。您可以将 List 属性直接放入 Variant 类型,将其排序为数组,然后将该 Variant Array 转储回 List 属性。仍然不是很好,但它是最好的 VBA。

      【讨论】:

        【解决方案4】:

        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 框架,但无法确定他们有它。
        • 是的。在这种情况下,您必须使用可用于 VBA 的众多排序解决方案之一。这是我通过 Google 随机找到的,使用 Heapsort:source-code.biz/snippets/vbasic/1.htm
        • 尽管对于少数组合框项目来说,简约的冒泡排序也不会扼杀你的表现。而且代码更少。
        • 是的。我必须先构建一个数组进行排序,然后构建一个排序函数,然后将其添加到组合框中,这有点荒谬,哈哈。我虽然可能有一个内置函数或其他东西。将值粘贴到加载项中的 excel 表中,对它们进行排序,然后将值插入可能会更容易。我不知道我是否想重新发明轮子。
        【解决方案5】:

        这使用了 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 数据集的更简单版本)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-03-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-29
          • 2010-12-12
          相关资源
          最近更新 更多