Заполнение вопросов ComboBox – дублирование значений при каждом выборе поля, а именованный диапазон не заполняется
Я новичок в VBA и StackOverflow, поэтому заранее извиняюсь за любые ошибки.
У меня есть UserForm, который, в конечном счете, будет иметь 16 ComboBoxes. Все 16 из этих ComboBoxes будут иметь те же 5 вариантов ответа на опрос).
Моя первая попытка состояла в том, чтобы заполнить их, как это, повторяется 16 раз для каждого ComboBox:
- XL VBA Как запретить игнорировать свойства UserTorm и .Left при первом .Show?
- Удалите всю строку на основе дубликата в ячейке без той, которая имеет конкретное значение ячейки
- Ячейка, подключенная средствами управления, продолжает терять формулу
- Как добавить объекты управления в пользовательскую форму в коллекцию, а затем прокрутить коллекцию и получить доступ к их свойствам?
- VBA Как проверить, существуют ли значения пользовательской формы combobox в базе данных
Private Sub cboAE1A_DropButtonClick() 'Populate control. Me.cboAE1A.AddItem "Strongly disagree" Me.cboAE1A.AddItem "Disagree" Me.cboAE1A.AddItem "Neither agree nor disagree" Me.cboAE1A.AddItem "Agree" Me.cboAE1A.AddItem "Strongly agree" End Sub
Однако, когда я тестирую форму, выбор ComboBox более одного раза дублирует параметры ответа. Итак, если я нажму на него один раз, все будет в порядке. Во второй раз я вижу 3 набора параметров ответа, так далее и т. Д. Почему это? Что я могу сделать, чтобы предотвратить это?
Во-вторых, в попытке избежать повторения вышеуказанного кода 16 раз, я нашел эту ссылку и попытался адаптировать ее для моих целей:
Private Sub ufrmGenderTraining_Initialize() 'Populate AE1A combo box. Dim rngRespuestas As Range Dim ws As Worksheet Set ws = Sheets("INPUTS") For Each rngRespuestas In ws.Range("Respuestas") Me.cboAE1A.AddItem rngRespuestas.Value Next rngRespuestas End Sub
Но ComboBox пуст. Любые идеи, как это исправить, и как эффективно заполнять эти 16 ComboBoxes с тем же списком? Если вы также можете объяснить, как мне 5 лет, это было бы очень признательно!
Заранее спасибо.
- Передача данных между UserForms
- отправка массовой электронной почты с помощью опции слияния из пользовательской формы vba
- Вызов пользовательской формы в Excel VBA и продолжение в зависимости от того, какая кнопка была нажата
- Мой ComboBox не отображает значения, которые я добавил в VBA
- Элемент управления Excel VBA Excel дает ошибку «Недопустимое значение свойства» при установке ширины
- Ошибка в Userform.Hide внутри Workbook_Deactivate event
- Как загрузить данные в Excel Userform Listbox из формы Access напрямую?
- Gif не воспроизводится непрерывно в Webbrowser Control в форме Excel VBA, пока выполняется другой код
Первоначально вы использовали событие DropButtonClick
.
Это означает, что каждый раз, когда вы нажимаете на ComboBox
, он добавляет те же элементы в список ComboBox
.
Следовательно, при первом нажатии на раскрывающееся меню отображается один раз, второй раз два раза и т. Д.
Вы также можете писать меньше кода, перебирая каждый Combobox и применяя одинаковые параметры к каждому из них. Пример:
Dim comboItems() As Variant Dim ct As Control Dim i As Long comboItems() = Array("Strongly disagree", _ "Disagree", _ "Neither agree nor disagree", _ "Agree", _ "Strongly agree") For Each ct In Me.Controls If TypeName(ct) = "ComboBox" Then For i = LBound(comboItems) To UBound(comboItems) ct.AddItem comboItems(i) Next i End If Next ct
Убедитесь, что вышеуказанный код используется в событии UserForm_Initialize
в UserForm.
Утверждение If
:
If TypeName(ct) = "ComboBox" And _ ct.Name <> "cboGender" And _ ct.Name <> "cboDepartment" Then
В первом примере событие срабатывает каждый раз, когда нажата кнопка выпадающего списка для данного ComboBox. Поэтому, когда форма загружается, доступных опций нет. Когда пользователь сначала нажимает на выпадающий список для первого ComboBox, событие срабатывает, и ваш код добавляет 5 вариантов. Пользователь выбирает параметр и продолжает.
Позже пользователь понял, что хочет изменить свой ответ на первый вопрос. Она снова нажимает кнопку выпадающего списка для первого ComboBox; ваш код затем выполняется снова, добавив еще 5 параметров, каждый из которых дублирует.
Я вижу, что вы исправили код события Initialize, чтобы сделать то, что вы намеревались; Я считаю, что это лучший вариант, чем ваш первый. Если, однако, вы предпочтете изменить исходный код, добавьте строку, которая сначала проверит свойство ListCount для ComboBox. Это предотвратит добавление параметров, если ComboBox уже заполнен ответами.
Private Sub cboAE1A_DropButtonClick() 'Check for existence of items If Me.cbo.AE1A.ListCount = 0 Then 'Populate control. Me.cboAE1A.AddItem "Strongly disagree" Me.cboAE1A.AddItem "Disagree" Me.cboAE1A.AddItem "Neither agree nor disagree" Me.cboAE1A.AddItem "Agree" Me.cboAE1A.AddItem "Strongly agree" End If End Sub