VBA Access - сортировка по алфавиту - PullRequest
0 голосов
/ 26 июня 2018

У меня есть два списка: 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 испортили меня. Любая помощь будет оценена ...

1 Ответ

0 голосов
/ 27 июня 2018

Использование словаря или коллекции позволит легко проверить наличие дубликатов. У '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

Комментарий ОП: «Я думаю, R, Python и SQL испортили меня»

MS Access - это база данных. Элементы управления MS Access можно напрямую связать с Recordsets, Queries и Tables. Вы можете просто создать таблицу для хранения значений в поле значения, которое не принимает дубликаты. Затем свяжите ListBox напрямую с Query, который возвращает отсортированные значения из Table. Easy Peasy!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...