Значение VBA ComboBox в Module1 - PullRequest
1 голос
/ 12 марта 2020

Здравствуйте. Я пытаюсь получить выбранное значение из моего ComboBox для работы в подпрограмме в Module1.

Private Sub UserForm_Initialize()
    With ComboBox1
        .AddItem "Monday"
        .AddItem "Tuesday"
    End With
End Sub

Я в основном пытаюсь получить выбранное значение для вставки в «Sheet1» , Я могу заставить это работать, если я вызываю «ComboBox1.value» в UserForm1, но не в модуле 1, где он выдает ошибку, говоря, что «ComboBox1.value» не определен. Буду признателен за любую помощь!

Sub EmailGenerator()
   UserForm1.Show
   Worksheets("Sheet1").Range("O5").Value = ComboBox1.Value
End Sub()

Ответы [ 2 ]

2 голосов
/ 12 марта 2020

Форма - это объект: это экземпляр класса UserForm1 - тот, который вы не создали сами (см. UserForm1.Show для всего, что влечет за собой), но, тем не менее, это объект .

Существует экземпляр элемента управления ComboBox с именем ComboBox1, который находится в этом объекте UserForm1 и доступен в интерфейсе publi c формы (точно так же, как если бы он был publi c). свойство самой формы!) - это то, как вы можете получить доступ к элементу управления из-за выделенного кода формы (примечание: это самый простой способ создания пользовательского интерфейса, но есть более совершенные и более масштабируемые способы, которые не нарушают инкапсуляцию) и оставьте форму ответственной за свои элементы управления, а остальная часть кода, к счастью, не знает о макете пользовательского интерфейса и о том, какие конкретно элементы управления c, см. ссылку выше).

VBA не знает на что ComboBox1 вы ссылаетесь, если только вы не квалифицируете вызов этого члена с объектом, которому он принадлежит, используя оператор . dot:

UserForm1.ComboBox1

Вы можете иметь UserForm2, который также имеет элемент управления ComboBox1, и может быть 20 рабочих листов, каждый со своим собственным элементом управления ComboBox1: они не могут жить в глобальной области видимости и не имеют.

Таким образом:

Worksheets("Sheet1").Range("O5").Value = UserForm1.ComboBox1.Value

Или лучше:

Public Sub EmailGenerator()
   With New UserForm1
       .Show '<~ form is modal, execution is blocked here until form is closed.
       Worksheets("Sheet1").Range("O5").Value = .ComboBox1.Value
   End With
End Sub
0 голосов
/ 12 марта 2020

Попробуйте этот подход, пожалуйста:

    With UserForm1.ComboBox1
        .AddItem "Monday"
        .AddItem "Tuesday"
        .ListIndex = 0
    End With

    ActiveSheet.Range("I1").value = UserForm1.ComboBox1.value

Нет необходимости показывать форму для этого. Но если вы не выберете что-либо в комбо, ничего не будет возвращено в ячейку. Если вы хотите сделать это последовательно, я бы рекомендовал сначала проверить, если UserForm1.Visible = True. Только предположим, что вы хотите вручную изменить значение комбо и только после этого собирать значения на листе.

Но этот подход, по крайней мере, странен для меня ... Я только попытался показать вам, как это возможно, но я бы не советовал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...