#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