Установите combobox в значение другого combobox – Access Vba

Вопрос: У меня есть две комбинированные поля в форме. ComboID и ComboName ComboID содержит такие элементы, как 1001, 1002, 1003, 1004 и т.д. ComboName содержит такие элементы, как John, Matt, David, Luke и т.д.... У меня есть таблица с этими данными: 1001, John 1002, Matt 1003, David 1004, Luke Я хочу, чтобы ComboID отображал 1001

Вопрос:

У меня есть две комбинированные поля в форме. 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. Любая помощь, пожалуйста?

Лучший ответ:Содержание

  1. Решение первого взгляда (не рекомендуется)
  2. Что это было
  3. Почему вы не должны использовать его
  4. Лучшее решение
  5. Почему проблематичный цикл не будет запущен

Решение первого взгляда (не рекомендуется)

Что это было

Моя первоначальная реакция на эту проблему состояла в том, чтобы попытаться использовать событие изменения. Тогда было бы выбрано создание подпрограмм для каждого выпадающего списка для изменения значения другого выпадающего списка.

Почему вы не должны использовать его

Однако в документации для событий изменения доступа 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

Оцените статью
Добавить комментарий