我有两个列表框: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宠坏了我。任何帮助将不胜感激...
答案 0 :(得分:3)
使用字典或馆藏将使检查重复项变得容易。 'ArrayList'和'SortedList'具有.Sort
方法,这些方法将为您排序数据。如果要手动添加数据,建议使用ActiveX列表框。
此GIF使用“ 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
MS Access是一个数据库。 MS Access控件可以直接链接到Recordsets
,Queries
和Tables
。您可以简单地创建一个表来保存带有不接受重复项的value字段的值。然后,将ListBox
直接链接到Query
,该返回的值来自Table
。 Easy Peasy!
答案 1 :(得分:0)
我使用了不同的函数来按字母顺序对多功能用户表单中的列表框进行排序。
在多列列表框中,用户可以按他想要的列进行排序。
'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