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 控件可以直接链接到Recordsets
、Queries
和Tables
。您可以简单地创建一个表来保存具有不接受重复值的值字段的值。然后将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 - 按字母顺序排序列表框的主要内容,如果未能解决你的问题,请参考以下文章