Начинающий Excel VBA Вопрос: Как ссылаться на переменные из списков в основной код пользовательской формы? - PullRequest
0 голосов
/ 29 октября 2018

Я новичок в VBA и мне нужна помощь в определении элементов списка. Например, скажем, у меня была пользовательская форма с 3 вариантами:

Listbox1: Item 1 
          Item 2 
          Item 3

И я хочу сослаться на них в основном коде, например:

If Listbox1 = *Item 1*
     do something

или

*Item 1* = 400

Мой вопрос: как мне ссылаться на Item 1 в коде? Будет ли это Listbox1.1? Listbox1 = 1? «Элемент 1»?

1 Ответ

0 голосов
/ 29 октября 2018

Вот один простой пример, иллюстрирующий концепцию. Как отметил Матье Гиндон в комментарии, вы можете использовать ListBox.Text.

Предположим, у вас есть следующая пользовательская форма, которая открывается нажатием кнопки «Показать пользовательскую форму». Я предполагаю из вашего вопроса, что вы хотели бы сделать что-то вроде выбора элемента в списке, а затем сделать что-то в коде, когда вы нажимаете кнопку OK. В моем примере, нажав кнопку ОК, вы увидите окно сообщения, в котором будет показан выбранный элемент, но вы, конечно же, можете делать все, что захотите. Код, который генерирует окно сообщения, находится в обычном модуле, а код кнопки «ОК» и «Список» - в форме пользователя.

enter image description here

Кнопка «Показать форму пользователя» просто вызывает следующую подпрограмму в обычном модуле:

Public Sub ShowForm1()
    UserForm1.Show
End Sub

Отображает форму пользователя, которая инициализируется следующим кодом:

Private Sub Userform_initialize()
    With Me.ListBox1
        .AddItem "Item 1"
        .AddItem "Item 2"
    End With
End Sub

Код ниже для кнопки ОК включает ссылку Me.ListBox1.Text, которая захватывает выбранный элемент и сохраняет его в переменной, которая затем передается подпрограмме ShowMsgBox в обычном модуле. Обратите внимание на использование Me., которое является сокращением для ссылки на пользовательскую форму, в которой находится список (т.е. ту же форму, что и кнопка OK):

Private Sub okButton_Click()
    sSelectedItem = Me.ListBox1.Text
    ShowMsgBox (sSelectedItem)
    Unload Me
End Sub

Код выше вызывает ShowMsgBox, который находится в обычном модуле:

Public Sub ShowMsgBox(sInput As String)
    MsgBox "You selected " & sInput & ".", vbOKOnly
    ' Other code to do something with the selected item goes here.
End Sub

Обратите внимание, что в ShowMsgBox() вы больше не ссылаетесь на список, а работаете со значением sInput, переданным в качестве аргумента.

Надеюсь, вы найдете это полезным.

EDIT:

После комментария Скай, вот предложение о том, как открыть другие формы вместо окна сообщения. Вы должны заменить одну строку в okButton_Click() , вот так:

Private Sub okButton_Click()
    sSelectedItem = Me.ListBox1.Text
    ShowOtherUserForm (sSelectedItem)
    Unload Me
End Sub

Затем в обычном модуле добавьте саб ShowOtherUserForm(). Эта подпрограмма использует Select Case, чтобы проверить, какой элемент был выбран. Вы можете сделать ту же самую работу с If, но я предпочитаю стиль Select для этого сценария. Мой пример требует, чтобы у вас было две пользовательские формы с именами «OtherForm1» и «OtherForm2».

Sub ShowOtherUserForm(sInput As String)
    Dim x As Object ' Must be "Object", declare "As UserForm" won't work.
    Select Case sInput
        Case "Item 1"
            Set x = OtherForm1
        Case "Item 2"
            Set x = OtherForm2
    End Select
    x.Show
End Sub

Скриншот результата:

enter image description here

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