Вопрос:
У меня есть две комбинированные поля в форме. ComboID и ComboName
ComboID содержит такие элементы, как 1001, 1002, 1003, 1004 и т.д. ComboName содержит такие элементы, как John, Matt, David, Luke и т.д….
У меня есть таблица с этими данными: 1001, John 1002, Matt 1003, David 1004, Luke
Я хочу, чтобы ComboID отображал 1001 когда я выбираю John из ComboName. И я также хочу, чтобы ComboName отображал “1002”, когда я выбираю Matt.
Мне нужно иметь возможность выбрать новое имя или идентификатор в любой точке и обновить соответствующее значение в другом комбинированном поле.
Я застрял в попытке заставить это работать, и это не может быть так сложно, как я это делаю. Я все еще изучаю код VBA. Любая помощь, пожалуйста?
Лучший ответ:Содержание
- Решение первого взгляда (не рекомендуется)
- Что это было
- Почему вы не должны использовать его
- Лучшее решение
- Почему проблематичный цикл не будет запущен
Решение первого взгляда (не рекомендуется)
Что это было
Моя первоначальная реакция на эту проблему состояла в том, чтобы попытаться использовать событие изменения. Тогда было бы выбрано создание подпрограмм для каждого выпадающего списка для изменения значения другого выпадающего списка.
Почему вы не должны использовать его
Однако в документации для событий изменения доступа VBA (ссылка выше) четко сказано:
“Избегайте создания двух или более элементов управления, имеющих события изменения, которые влияют друг на друга – например, два текстовых поля, которые обновляют друг друга” (msdn access vba change event)
К сожалению, это именно то, что вы делали бы с помощью решения об изменении событий (с использованием списков со списком вместо текстовых полей). В вашем примере изменение комбо-комбинации ComboID приведет к соответствующему изменению в combobox ComboName, но это изменение в combobox ComboName вызовет попытку изменения в ComboID, и этот цикл может продолжаться. Поэтому это не является хорошим ответом на вашу проблему.
Лучшее решение
Событие AfterUpdate представляется более подходящим подходом к использованию в этом случае.
Почему проблематичный цикл не будет запущен
Как упоминалось в документации AfterUpdate:
Изменение данных в элементе управления с помощью Visual Basic или макроса, содержащего действие SetValue, не вызывает эти события для элемента управления.
Следовательно, событие AfterUpdate (возможно, с помощью SetValue) должно быть гораздо лучшим подходом.
Огромное спасибо @Remou за то, что он указал на ошибку моих способов изменения событий и привлек внимание к событию AfterUpdate.
Ответ №1
Событие изменения очень редко является подходящим выбором для кода. Например, combobox позволяет пользователю печатать так же, как и выбирать элементы, поэтому событие изменения будет срабатывать для каждого вводимого символа. Как и любые события, прикованные к этому событию, приводящие к возможности ужасных осложнений.
Настройте соответствующие поля, подумайте, что это тайна относительно того, почему вы хотите это сделать. Возможно, вам придется синхронизировать их в текущем событии. Вы не упоминаете, связаны ли комбо с источником управления, поэтому я не включил его.
ComboID
RowSource: SELECT ID, [Name] FROM Table ORDER BY ID BoundColumn: 1 ColumnCount: 2 ColumnWidths: 2cm;0cm »The second column is hidden, »the first column is any width Private Sub ComboID_AfterUpdate() Me.ComboName = Me.ComboID End Sub
ComboName
RowSource: SELECT ID, [Name] FROM Table ORDER BY [Name] BoundColumn: 1 ColumnCount: 2 ColumnWidths: 0cm;2cm »The first column is hidden, »the second column is any width Private Sub ComboName_AfterUpdate() Me.ComboID = Me.ComboName End Sub