VBA访问-按字母顺序排序列表框

时间:2018-06-26 19:43:18

标签: vba sorting ms-access listbox

我有两个列表框: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进行排序,所以这种方法对我来说最有意义。我有些f异,似乎找不到能够使我轻松完成此操作的现有列表框方法或函数。我仔细阅读了这个论坛和其他论坛,但没有找到一个好的解决方案。我想R,Python和SQL宠坏了我。任何帮助将不胜感激...

2 个答案:

答案 0 :(得分:3)

使用字典或馆藏将使检查重复项变得容易。 'ArrayList'和'SortedList'具有.Sort方法,这些方法将为您排序数据。如果要手动添加数据,建议使用ActiveX列表框。

enter image description here

此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。您可以简单地创建一个表来保存带有不接受重复项的value字段的值。然后,将ListBox直接链接到Query,该返回的值来自Table。 Easy Peasy!

答案 1 :(得分:0)

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

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

enter image description here

'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