Как я могу использовать OptionBox для управления значением ComboBox с выборочными значениями из моего рабочего листа? - PullRequest
0 голосов
/ 09 мая 2020

Я ищу метод, который может легко связать выбранные значения из моего рабочего листа в списке поля со списком на основе выбранного поля параметров. Я новичок в VBA, и мне интересно, не ошибаюсь ли я в синтаксисе. Я считаю, что мой метод верен, но при выборе параметра я продолжаю получать сообщение об ошибке: Ошибка компиляции: Подраздел функции не определен. Эта ошибка возникает, когда задействованы кнопки выбора Private Sub. Если я удалю эту часть кода, то мой список ComboBox станет пустым, но я не получу сообщения об ошибке. Я привык работать с JavaScript, поэтому вызов функций очень распространен, может быть, не с VBA?

Dim myTable As Range

'Updated by Extendoffice 2018/1/30
Private Sub UserForm_Initialize()
    Set myTable = Worksheets("Sheet1").Range("A2:B8")
    If OptionButton1 = True And OptionButton2 = False Then

       Me.ComboBox1.List = myTable.Range("A2:A3").Value
    ElseIf OptionButton2 = True And OptionButton1 = False Then
     Me.ComboBox1.List = myTable.Range("A5:A8").Value
    End If

End Sub


Private Sub OptionButton1_Change()
Call UserForm
End Sub

Private Sub OptionButton2_Change()
Call UserForm
End Sub

Это результат формы, когда поле выбора выбрано без включения последних 6 строк кода выше

1 Ответ

0 голосов
/ 09 мая 2020

На основе вашего изображения пользовательской формы, я воспроизвел вашу форму с 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:

Dummy data on sheet1

Первое открытие:

UserForm first opened.

Список OptionButton1: ______________________ Список OptionButton2: _______________________

Option button 1 list Option button 2 list


Вы можете записать все это в функцию (или подпрограмму) и вызвать , что так, как вы пытаются вызвать событие 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
...