VBA Access - 按字母顺序排序列表框

Posted

技术标签:

【中文标题】VBA Access - 按字母顺序排序列表框【英文标题】:VBA Access - alphabetically sort listbox 【发布时间】:2018-06-26 19:43:18 【问题描述】:

我有两个列表框:listbox1 和 listbox2。 Listbox2 是通过用户选择填充的值列表。我需要防止将重复项输入到 listbox2 中。我当前的解决方案检查以前的列表框记录以查看它是否等于当前循环迭代 - 如果是,则删除重复项:

Set ctlSource = Me!listbox1
For intCurrentRow = 0 To ctlSource.ListCount - 1
    If ctlSource.Selected(intCurrentRow) Then
        strItems = "'" & ctlSource.Column(1, intCurrentRow) & "'"
        Me!listbox2.AddItem (strItems)
    End If
Next intCurrentRow

Dim intItems As Integer
Dim i As Integer



'deletes  duplicates
For i = 0 To Me.listbox2.ListCount - 1
        If Me!listbox2.ItemData(i) = Me!listbox2.ItemData(i - 1) Then
             Me!listbox2.RemoveItem (i)
        End If
Next i

但是,这需要对 listbox2 进行排序。我希望 listbox2 无论如何都按字母顺序排序,所以这种方法对我来说最有意义。我有点吃惊,我似乎无法找到一个现有的列表框方法或函数来让我轻松地做到这一点。我已经仔细阅读了这个论坛和其他人,但没有找到一个好的解决方案。我猜 R、Python 和 SQL 宠坏了我。任何帮助将不胜感激...

【问题讨论】:

首先将 listbox1 中的有效条目放入一个数组中,然后对数组进行排序,然后循环遍历它以将项目添加到 listbox2 中,这可能是最简单的。删除重复项后,您应该能够执行此操作。无需删除项目,只需将不匹配的项目添加到数组中,对数组进行排序,然后将数组值加载到 listbox2 中。 由于列表项可能在工作表中,因此在加载列表之前“在”加载列表之前,请使用范围内的自动过滤器唯一性或排序功能来消除重复项并按您喜欢的方式排序。我不明白我猜,你有两个列表框来删除列表 1 中存在的列表 2 中的重复项?我建议在刷新列表之前。 【参考方案1】:

使用字典或集合可以轻松检查重复项。 'ArrayList' 和 'SortedList' 具有 .Sort 方法,可以为您对数据进行排序。如果您想手动添加数据,我建议使用 ActiveX 列表框。

此 GIF 使用“ArrayList 演示代码”来演示如何使用 ArrayList 删除重复项和排序值。

ArrayList 演示代码

Private Sub btnAddItem_Click()
    Dim n As Long
    Dim lbox As MSForms.ListBox, list As Object
    Set lbox = Me.ListBox0.Object
    Set list = CreateObject("System.Collections.ArrayList")

    For n = Me.ListBox2.ListCount - 1 To 0 Step -1
        If Not list.Contains(Me.ListBox2.ItemData(n)) Then list.Add Me.ListBox2.ItemData(n)
        Me.ListBox2.RemoveItem n
    Next

    If Not list.Contains(Me.Text6.Value) Then list.Add Me.Text6.Value

    list.Sort

    For n = 0 To list.Count - 1
        Me.ListBox2.AddItem list(n)
    Next

    lbox.list = list.ToArray
End Sub

Private Sub btnFillList_Click()
    Dim lbox As MSForms.ListBox
    Set lbox = Me.ListBox0.Object
    Dim n As Long
    For n = 65 To (65 + 25) Step 2
        lbox.AddItem Chr(n)
        Me.ListBox2.AddItem Chr(n)
    Next
End Sub

Sub btnRemoveAll_Click()
    Dim n As Long
    Dim lbox As MSForms.ListBox
    Set lbox = Me.ListBox0.Object
    For n = Me.ListBox2.ListCount - 1 To 0 Step -1
        Me.ListBox2.RemoveItem n
    Next
    lbox.clear
End Sub

OP 评论:“我猜 R、Python 和 SQL 把我宠坏了”

MS Access 是一个数据库。 MS Access 控件可以直接链接到RecordsetsQueriesTables。您可以简单地创建一个表来保存具有不接受重复值的值字段的值。然后将ListBox 直接链接到Query,该Query 返回来自Table 的排序值。轻松愉快!

【讨论】:

【参考方案2】:

我使用不同的函数按字母顺序对多功能用户表单中的列表框进行排序。

在多列列表框中,用户可以按自己想要的列进行排序。

'Sort the Array as Alphabetically 1
 If sType = 1 Then
 For i = LBound(var_item, 1) To UBound(var_item, 1) - 1
 For j = i + 1 To UBound(var_item, 1)
 'Sort Ascending 1
 If sDir = 1 Then
 If var_item(i, sColmn) > var_item(j, sColmn) Then
 For c = 0 To oListBx.ColumnCount - 1 'Allows sorting of multi column List Boxes
 var_temp = var_item(i, c)
 var_item(i, c) = var_item(j, c)
 var_item(j, c) = var_temp
 Next c
 End If

Details and sample file here

【讨论】:

以上是关于VBA Access - 按字母顺序排序列表框的主要内容,如果未能解决你的问题,请参考以下文章

是否可以通过组合框值列表进行排序?

按字母顺序排序和过滤使用工作表名称自动填充的组合框

按字母顺序排序时忽略变音符号

如何按字母顺序对数据框的行进行排序? [复制]

按字母顺序排序列表

在数据框python的每一行中按字母顺序对单词进行排序