2013-08-01 2 views
2

Я очень новичок в программировании VBA. В моем сценарии я получаю список значений String Мне нужны эти значения, которые будут отображаться пользователю с помощью переключателей на маленьком окне, чтобы всякий раз, когда пользователь выбирает любое значение, нажав на переключатель, я должен быть в состоянии получить это значение в коде VBA. Я искал кнопку добавления опций в форме пользователя в Интернете. Я получил некоторое решение, которое использует GUI-метод создания кнопок параметров. Но мне нужно это сделать через программу. Я нашел полезный поток в stackoverflow (How can I dynamically add a radio button on a form using VBA) Я использовал это, но все же я не могу получить какую-либо метку или кнопку в пользовательской форме, будет отображаться простая пользовательская форма. Поэтому, пожалуйста, сообщите об этом.Добавление OptionButtons к Userform программно в VBA Excel

Код:

Sub Button1_Click() 
    lResult As Variant ' this is a array which contains string vaues to be dispayed as radio button. 

    ' Some operatin is done here to get the list of values in lResult 

    Dim rad As Variant 
    Set rad = UserForm1.Controls.Add("Forms.OptionButton.1", "radioFoo", True) 
    rad.Caption = "bar" 
    rad.Left = 10 
    rad.Width = 10 
    rad.Top = 10 
End Sub 

UserForm1 является UserForm, который я создал с помощью опции Вставить в строке меню VBA. Я попытался добавить одну кнопку в пользовательскую форму. Я не использовал функцию инициализации в пользовательской форме. Существует кнопка на листе excel Button1 Я вызываю эту функцию при нажатии этой кнопки.

Спасибо

+0

Почему бы не использовать вместо listbox со словом «list style», установленным в «listStyleOption», и отформатируйте его так, чтобы он выглядел как набор кнопок параметров (без границы, задний цвет такой же, как форма ...)? Это будет намного легче управлять. –

+0

Какой у вас код в UserForm_Initialize() '? Очень сложно ответить на такой неопределенный вопрос, не видя кода, который у вас уже есть. –

+0

@ Declan_k Большое спасибо. Прошу прощения, я добавил часть кода, которую я использую. Пожалуйста, дайте мне знать, какую коррекцию я должен внести. – Anup

ответ

5

Если у вас есть форма с именем UserForm1, которая содержит кнопку с именем CommandButton1

UserForm



Вы можете установить метод Initialize для вашего UserForm программно создать группу радиокнопок

Private Sub UserForm_Initialize() 
    Dim OptionList(1 To 3) As String 
    Dim btn As CommandButton 
    Set btn = UserForm1.CommandButton1 
    Dim opt As Control 
    Dim s As Variant 
    Dim i As Integer 

    OptionList(1) = "Option 1" 
    OptionList(2) = "Option 2" 
    OptionList(3) = "Option 3" 

    For Each s In OptionList 
     Set opt = UserForm1.Controls.Add("Forms.OptionButton.1", "radioBtn" & i, True) 
     opt.Caption = s 
     opt.Top = opt.Height * i 
     opt.GroupName = "Options" 

     UserForm1.Width = opt.Width 
     UserForm1.Height = opt.Height * (i + 2) 

     i = i + 1 
    Next 

    btn.Caption = "Submit" 
    btn.Top = UserForm1.Height - btn.Height + (0.5 * opt.Height) 
    btn.Left = (UserForm1.Width * 0.5) - (btn.Width * 0.5) 

    UserForm1.Height = UserForm1.Height + btn.Height + (0.5 * opt.Height) 
End Sub 

Private Sub CommandButton1_Click() 
    Dim i As Integer 

    For i = 0 To UserForm1.Controls.Count - 1 
     If UserForm1.Controls(i) Then 
      SelectedOption = UserForm1.Controls(i).Caption 
     End If 
    Next 

    UserForm1.Hide 
End Sub 



Если вы хотите вывести свой список из листа можно изменить

Dim OptionList(1 To 3) As String 

OptionList(1) = "Option 1" 
OptionList(2) = "Option 2" 
OptionList(3) = "Option 3" 

, чтобы вытащить из диапазона, как этого

Dim OptionList() as Variant 
OptionList = Range("A1:A3") 


В вашем "button_onclick()" процедуры хранящиеся в модуле, добавить этот код:

'This is set by the code in UserForm1 
Public SelectedOption As String 

Sub Button1_OnClick() 
    UserForm1.Show 
    MsgBox SelectedOption 
End Sub 



Что получает вас этот результат:

enter image description here

И при нажатии кнопки отправить окно сообщения выскочит показывая, какой вариант был выбран

enter image description here

+0

Большое спасибо за ваш полный код. Но у меня есть кнопка на моем листе excel. Поэтому при нажатии этой кнопки мне нужно вызвать UserForm_Inititialize(). Так как я могу это сделать. Код button_onclick присутствует в модуле 1. Теперь, как я могу назвать этот метод методом button_onclick(). Пожалуйста, дайте мне знать об этом. – Anup

+0

Внутри вашего метода button_onclick() запустите 'UserForm1.Show' – Ripster

+0

Привет, большое спасибо, он сработал. Я помещаю UserForm1.show внутри метода button_click(). Теперь окно отображается с помощью переключателя. Огромное спасибо. Но следующая вещь, когда я нажимаю кнопку, не показывает, какой переключатель нажата. Я хочу сказать, что элемент управления не будет использовать метод commandButton1_onclick(). Моя программа похожа на этот button_onclick() имеет код, который присутствовал в UserForm_initializer(), и после этой функции я создал еще одну функцию CommandButton1_onclick(), у которой есть код, который вы предложили для командной кнопки. – Anup

1

Помните при помощи переключателей, ваши кнопки выбора должны одни и те же GroupName.
Ваш контроль Имя только для вас, чтобы вернуть его для изменения/чтения.
Ваш Caption - это строка, которая отображается в пользовательской форме для пользователей.
GroupName - это строка, которая позволяет Excel распознавать кнопки параметров, связанные друг с другом.

Итак, если имя_группы opt1 равно «1», в то время как groupName opt2 - «2», вы сможете выбрать оба, так как они находятся в разных группах.

Private Sub UserForm_Initialize() 
    Dim opt1 As Control, opt2 As Control 

    Set opt1 = UserForm1.Controls.Add("Forms.OptionButton.1", , True) 
    With opt1 
     .Name = "radioFoo" 
     .GroupName = "1" 
     .Caption = "Option 1" 
    End With 

    Set opt2 = UserForm1.Controls.Add("Forms.OptionButton.1", , True) 
    With opt2 
     .Name = "radioFoo2" 
     .GroupName = "1" 
     .Caption = "Option 2" 
     .Left = 100 
    End With 

End Sub 


EDIT:
видеть ваше отредактированное сообщение и комментарий ...
Нет, вам не нужно иметь метод UserForm_Initialize().

Это функциональность Excel-VBA под названием Событие.
Для чего он используется, это указание пользовательской формы сделать что-то, когда пользовательформа будет инициализирована (сначала запущена).
Аналогично вашему коду, Button1_Click() также является событием.
Поскольку вы говорите Excel, чтобы сделать следующее в случае, когда пользователь нажал кнопку Button1 ...

В любом случае позвольте мне вкратце объяснить вам, какие кнопки с кнопками.
И кнопка выбора в VBA позволяет вам создать только один вариант. Итак, если вы хотите создать 2 варианта, вы должны создать 2 кнопки.
Но есть только одна проблема: что делать, если вы хотите создать две группы опционных кнопок, чтобы пользователь мог выбрать 2 отдельных варианта? Например, еда и напитки?
VBA представляет нам свойство кнопки с опцией GroupName. GroupName позволяет VBA различать отдельные группы кнопок опций.
Таким образом, при каждой кнопке выбора, необходимо, чтобы вы инициализировали ее значение GroupName. Если вы видите какую-либо реализацию кнопки опции без GroupName, вы играете с огнем.

Итак, давайте, наконец, посмотрим на код:

Sub Button1_Click() 
    ' Some operatin is done here to get the list of values in lResult 

    Dim rad1 As Control, rad2 As Control 
    Set rad1 = UserForm1.Controls.Add("Forms.OptionButton.1", "radioFoo1", True) 
    rad1.Caption = "bar" 
    rad1.Left = 10 
    rad1.Width = 10 
    rad1.Top = 10 
    rad1.GroupName = "Group1" 

    Set rad2 = UserForm1.Controls.Add("Forms.OptionButton.1", "radioFoo2", True) 
    rad2.Caption = "foo" 
    rad2.Left = 10 
    rad2.Width = 10 
    rad2.Top = 50 
    rad2.GroupName = "Group1" 
End Sub 

Только одна вещь:
- Как я уже косвенно упоминалось выше, кнопка вариант только один вариант ничего не значит , Если вы ищете возможность включения/выключения функции, вы можете также пойти с флажком.
Итак, я создал другую кнопку опции, определяющую ее в той же группе, что и первая кнопка выбора, которую вы создали (rad1).

Надеюсь, это поможет.

Приветствия,
kpark

Не забудьте выбрать лучший ответ, когда вопрос/проблема была отвеченных/решена. Спасибо.

+0

Большое спасибо за ваше решение. Я попробую это. Я не создал метод userform_initilize(). Мне нужно создать его. Я отредактировал свой пост, добавив код, над которым я работаю, если возможно, вы можете проверить мой код один раз и сообщить мне, где я могу поместить метод userform_initialize(). Мне очень жаль, потому что я новичок в этой области. Мне трудно понять, как работает пользовательская форма. – Anup

+0

Userform_Initialize() можно найти, щелкнув правой кнопкой мыши на модуле userform и нажав на код просмотра. Затем над окном кода вы увидите два раскрывающихся меню. В первом меню выберите Userform и во втором меню выберите «Инициализировать», и редактор должен сделать для вас все остальное. – kpark

+0

Ответ был отредактирован, чтобы ответить на ваш вопрос. – kpark

Смежные вопросы