На основе вашего изображения пользовательской формы, я воспроизвел вашу форму с UserForm1
и всеми именами по умолчанию для всех элементов управления.
Если вы переместите свои операторы If...Then
в свои Optionbutton_Change()
события, вы заполните свои списки.
Per Документация Microsoft о событии Initialize
:
Событие Initialize обычно используется для подготовки приложения или пользовательской формы к использованию. Переменным назначаются начальные значения и элементы управления можно перемещать или изменять их размер в соответствии с данными инициализации.
Таким образом, данные не обновляются после того, как вы уже загрузили форму.
Я протестировал следующее на новой книге с фиктивными данными в A1:A10
для первого списка кнопок выбора и B1:B10
для второго списка кнопок выбора.
Примечание: все это содержится в модуле кода UserForm
.
Option Explicit
Private Sub OptionButton1_Change()
Dim TargetRange As Range
Dim TargetCell As Range
If Me.OptionButton1 = True Then
Me.ComboBox1.Clear '<~~ This removes the previous list items from the combobox.
Me.ComboBox1.Value = "" '<~~ Removes the default value added at initialization.
Set TargetRange = Sheet1.Range("A1:A10")
For Each TargetCell In TargetRange
Me.ComboBox1.AddItem TargetCell.Value
Next TargetCell
End If
End Sub
Private Sub OptionButton2_Change()
If Me.OptionButton2 = True Then
Me.ComboBox1.Clear '<~~ This removes the previous list items from the combobox.
Me.ComboBox1.Value = "" '<~~ Removes the default value added at initialization.
Set TargetRange = Sheet1.Range("B1:B10")
For Each TargetCell In TargetRange
Me.ComboBox1.AddItem TargetCell.Value
Next TargetCell
End If
End Sub
Private Sub UserForm_Initialize()
Me.ComboBox1.Value = "Select an OptionButton below..."
End Sub
Ключевые изменения в моем коде на ваш:
- Я обновляю свой список
ComboBox
в обработчике событий OptionButton_Change()
. - Я не оценивал, является ли один из них
True
, а другой False
, так как OptionButtons может иметь только один выбранный в любой момент в своей группе. - Я использовал фиктивные данные в диапазоне, не связанном с вашим листом, но вам просто нужно изменить ссылки на ваши листы и диапазоны.
- Я включил
Me.ComboBox1.Clear
в качестве первого оператора, выполняемого, если выбран OptionButton
, о котором идет речь, поскольку это очищает список, который, возможно, уже заполнен - Если вы опустите это и Пользователь щелкает
OptionButton1
, заполняя первый диапазон значений в ComboBox, а затем щелкает OptionButton2
, и в итоге ваш второй диапазон значений добавляется в конец списка после уже заполненного первого диапазона значений.
- Я включил значение по умолчанию в
ComboBox
, добавленное в событие Initialize
. Это не обязательно.
Примеры скриншотов поведения форм:
Фиктивные данные на листе 1:
Первое открытие:
Список OptionButton1: ______________________ Список OptionButton2: _______________________
Вы можете записать все это в функцию (или подпрограмму) и вызвать , что так, как вы пытаются вызвать событие Initialize
.
Вот пример подпрограммы:
Public Sub ChangeMyComboBoxList()
Dim TargetRange As Range
Dim TargetCell As Range
If UserForm1.OptionButton1 = True Then
UserForm1.ComboBox1.Clear '<~~ This removes the previous list items from the combobox.
UserForm1.ComboBox1.Value = "" '<~~ Removes the default value added at initialization.
Set TargetRange = Sheet1.Range("A1:A10")
For Each TargetCell In TargetRange
Me.ComboBox1.AddItem TargetCell.Value
Next TargetCell
ElseIf UserForm1.OptionButton2 = True Then
UserForm1.ComboBox1.Clear '<~~ This removes the previous list items from the combobox.
UserForm1.ComboBox1.Value = "" '<~~ Removes the default value added at initialization.
Set TargetRange = Sheet1.Range("B1:B10")
For Each TargetCell In TargetRange
UserForm1.ComboBox1.AddItem TargetCell.Value
Next TargetCell
End If
End Sub
Private Sub OptionButton1_Change()
ChangeMyComboBoxList '<~~ Call is not required
End Sub
Private Sub OptionButton2_Change()
ChangeMyComboBoxList '<~~ Call is not required
End Sub