Выберите поле списка, добавьте значение в другое поле списка, не допуская дубликатов

#vba #ms-access #ms-access-2016 #ms-access-forms

#vba #ms-доступ #ms-access-2016 #ms-access-формы #ms-access #ms-access-forms

Вопрос:

У меня есть два поля списка в форме, которую я создаю. Первое поле списка связано с таблицей с различными названиями компаний. Цель, к которой я стремлюсь, заключается в том, что после двойного щелчка по названию компании значение вставляется во второе поле списка.

Это работало нормально, пока я не попытался добавить код, чтобы предотвратить появление дубликатов во втором окне списка, чтобы вы не могли случайно вставить одну и ту же компанию дважды. Я попробовал несколько разных итераций, но безуспешно. Кто-нибудь может помочь с этим? Моей конечной целью было бы, чтобы msgbox появилось всплывающее окно, предупреждающее пользователя о том, что дубликаты не разрешены.

 Private Sub ContractorLstbx_DblClick(Cancel As Integer)
    Dim found As Boolean
    found = False
    Dim ID As Long
    Dim Contractor As String
    
    For Each newItem In Me.ContractorLstbx.ItemsSelected
        For j = 0 To Me.SelectedContractorLst.ListCount - 1
            If (Me!ContractorLstbx.ItemData(newItem).Column(1) = Me.SelectedContractorLst.ItemData(j).Column(1)) Then
                found = True
                Exit For
            End If
        Next j
        If found = False Then
            ID = Me.ContractorLstbx.ItemData(newItem)
            Me.SelectedContractorLst.AddItem ContractorLstbx!.ItemData(newItem).Column(0) amp; ";" amp; Me!ContractorLstbx.ItemData(newItem).Column(1)
            
        End If
        found = False
    Next newItem
End Sub
  

Комментарии:

1. Почему бы не удалить выбранные элементы из первого списка?

2. Я полагаю, что это могло бы сработать и, вероятно, было бы проще в долгосрочной перспективе. Это не повлияло бы на таблицу, не так ли? Я новичок в этом, поэтому не до конца понимаю все и учусь по ходу дела.

3. Я не знаю — я думаю, это зависит от того, как настроен ваш список. Я не специалист по доступу, поэтому, возможно, кто-то другой может подключиться…

4. Ваш код кажется правильным и должен функционировать, но я замечаю одну точку в контрольной строке If (Me!ContractorLstbx.ItemData(newItem).Column(1) = Me.SelectedContractorLst.ItemData(j).Column(1)) Then попробуйте заменить «!» после первого меня на «.» как я предполагаю, это даст нулевое значение, поскольку он пытается вызвать значение записи, а не значение элемента списка, поэтому оно никогда не войдет внутрь. Попробуйте поставить точку останова в этой строке и проверить значения в состоянии, и вы получите причину проблемы.

5. @Tmyers Извините, что эту строку кода также необходимо изменить. Вот измененный, и вы можете скопировать вставить напрямую: Me.SelectedContractorLst.AddItem ContractorLstbx.ItemData(newItem).Column(0) amp; ";" amp; Me.ContractorLstbx.ItemData(newItem).Column(1)

Ответ №1:

Это полный код для вашего решения. Я попробовал это на тестовом образце, и все работает нормально. просто скопируйте и вставьте код. Если вам нужно, чтобы ваше сравнение учитывало регистр символов (я имею в виду A <> a), то используйте Option Compare Binary , как в моем коде ниже. Если требуется, чтобы он не учитывал регистр (A = a), просто оставьте значение по умолчанию Option Compare Database или лучше принудительно используйте Option Compare Text

 Option Compare Binary

Private Sub ContractorLstbx_DblClick(Cancel As Integer)
    Dim found As Boolean
    found = False
    Dim ID As Long
    Dim Contractor As String

    For i = 0 To Me.ContractorLstbx.ItemsSelected.Count - 1
        For j = 0 To Me.SelectedContractorLst.ListCount - 1
            If (Me.ContractorLstbx.Column(1, Me.ContractorLstbx.ItemsSelected(i)) = Me.SelectedContractorLst.Column(1, j)) Then
                found = True
                Exit For
            End If
        Next j
        If found = False Then
            ID = Me.ContractorLstbx.ItemData(Me.ContractorLstbx.ItemsSelected(i))
            Me.SelectedContractorLst.AddItem (ContractorLstbx.Column(0, Me.ContractorLstbx.ItemsSelected(i)) amp; ";" amp; Me.ContractorLstbx.Column(1, Me.ContractorLstbx.ItemsSelected(i)))
        
        End If
        found = False
    Next i
End Sub