Элемент управления пользовательской формы OptionButton для выбора одной опции из группы и передачи результата в VBA Excel. Свойства переключателя, примеры.
UserForm.OptionButton – это элемент управления пользовательской формы, который используется в группе одноименных элементов и предназначен для передачи в код VBA информации о его выборе или невыборе пользователем: False – переключатель не выбран, True – переключатель выбран.
В VBA Excel элемент управления OptionButton состоит из белого кружка с черной точкой (переключатель выбран) или без нее (переключатель не выбран) и надписи. Надпись расположена справа и реагирует на нажатие мышью так же, как и белый кружок.
В отличие от элемента управления CheckBox, только один OptionButton из группы переключателей может иметь значение True. Для разделения разных групп переключателей друг от друга используются элементы управления Frame (рамки). Все переключатели вне рамок являются одной группой.
Так же, как и элемент управления CheckBox, OptionButton принимает третье состояние при присвоении ему в коде VBA Excel значения Null. Переключатель отображается с серым кружком и серой точкой.
Свойства элемента Переключатель
Свойство | Описание |
---|---|
AutoSize | Автоподбор размера переключателя. True – размер автоматически подстраивается под длину набираемой строки. False – размер элемента управления определяется свойствами Width и Height. |
ControlSource | Ссылка на источник данных для свойства Value. |
ControlTipText | Текст всплывающей подсказки при наведении курсора на OptionButton. |
Enabled | Возможность взаимодействия пользователя с элементом управления. True – взаимодействие включено, False – отключено (цвет переключателя становится серым). |
Font | Шрифт, начертание и размер текста надписи. |
Height | Высота элемента управления. |
Left | Расстояние от левого края внутренней границы пользовательской формы до левого края элемента управления. |
Picture | Добавление изображения вместо текста надписи или дополнительно к нему. |
PicturePosition | Выравнивание изображения и текста в поле надписи. |
TabIndex | Определяет позицию элемента управления в очереди на получение фокуса при табуляции, вызываемой нажатием клавиш «Tab», «Enter». Отсчет начинается с 0. |
TextAlign* | Выравнивание текста надписи: 1 (fmTextAlignLeft) – по левому краю, 2 (fmTextAlignCenter) – по центру, 3 (fmTextAlignRight) – по правому краю. |
Top | Расстояние от верхнего края внутренней границы пользовательской формы до верхнего края элемента управления. |
Value | Значение переключателя: True – включен, False – выключен, Null – серый кружок с серой точкой. |
Visible | Видимость элемента OptionButton. True – элемент отображается на пользовательской форме, False – скрыт. |
Width | Ширина элемента управления. |
WordWrap | Перенос текста надписи на новую строку при достижении границы ее поля. True – перенос включен, False – перенос выключен. |
* При загруженной в поле надписи картинке свойство TextAlign не работает, следует использовать свойство PicturePosition.
Свойство по умолчанию для элемента OptionButton – Value, основное событие – Click.
В таблице перечислены только основные, часто используемые свойства переключателя. Все доступные свойства отображены в окне Properties элемента управления OptionButton.
Примеры кода VBA с OptionButton
Пример 1
Отображение элементов управления OptionButton на пользовательской форме с параметрами, заданными в коде VBA Excel:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
Private Sub UserForm_Initialize() With Me .Width = 160 .Height = 110 .Caption = «Пьедестал почета» End With With OptionButton1 .Caption = «1 место» .Value = True .Width = 60 .Height = 18 .Left = 60 .Top = 18 .Font.Size = 10 End With With OptionButton2 .Caption = «2 место» .Value = False .Width = 60 .Height = 18 .Left = 12 .Top = 36 .Font.Size = 10 End With With OptionButton3 .Caption = «3 место» .Value = False .Width = 60 .Height = 18 .Left = 90 .Top = 48 .Font.Size = 10 End With End Sub |
Разместите на пользовательской форме три переключателя с именами OptionButton1, OptionButton2, OptionButton3 и добавьте в модуль формы представленный выше код. Запуск этого кода отобразит следующую форму:
Пример 2
Управление доступностью двух групп переключателей, заключенных в рамки, с помощью двух управляющих элементов OptionButton, расположенных непосредственно на пользовательской форме.
Для этого создадим следующий проект формы в редакторе VBA Excel («Рыбы» и «Птицы» большими буквами – это значения свойств Caption рамок Frame1 и Frame2):
В модуль формы вставляем следующий код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
‘Присвоение исходных значений ‘свойствам элементов управления ‘перед отображением формы Private Sub UserForm_Initialize() OptionButton1.Value = False OptionButton2.Value = False OptionButton3.Enabled = False OptionButton4.Enabled = False OptionButton5.Enabled = False OptionButton6.Enabled = False OptionButton7.Enabled = False OptionButton8.Enabled = False Frame1.Enabled = False Frame2.Enabled = False End Sub ‘Смена значений свойств переключателей, ‘расположенных в рамке Frame1, ‘при смене значения OptionButton1.Value Private Sub OptionButton1_Change() If OptionButton1.Value Then Frame1.Enabled = True With OptionButton3 .Value = False .Enabled = True End With With OptionButton4 .Value = False .Enabled = True End With With OptionButton5 .Value = False .Enabled = True End With Else Frame1.Enabled = False With OptionButton3 .Value = False .Enabled = False End With With OptionButton4 .Value = False .Enabled = False End With With OptionButton5 .Value = False .Enabled = False End With End If End Sub ‘Смена значений свойств переключателей, ‘расположенных в рамке Frame2, ‘при смене значения OptionButton2.Value Private Sub OptionButton2_Change() If OptionButton2.Value Then Frame2.Enabled = True With OptionButton6 .Value = False .Enabled = True End With With OptionButton7 .Value = False .Enabled = True End With With OptionButton8 .Value = False .Enabled = True End With Else Frame2.Enabled = False With OptionButton6 .Value = False .Enabled = False End With With OptionButton7 .Value = False .Enabled = False End With With OptionButton8 .Value = False .Enabled = False End With End If End Sub |
При запуске пользовательской формы или процедуры UserForm_Initialize()
откроется форма с неактивными переключателями в рамках Frame1 и Frame2. Нажатие мышью на элементы управления OptionButton с надписями «Рыбы» и «Птицы» будет активировать группу переключателей в одноименных рамках.
В этой статье мы рассмотрим такой элемент управления как OptionButton – Переключатель. Полагаю, многим приходилось видеть форму, на которой находятся несколько надписей и возле каждой надписи маленькая точка. Пользователь может выбрать только один элемент из списка. Компонент OptionButton в vba также называется RadioButton – по аналогии с радио, где можно выбрать одновременно только одну радиостанцию.
Если вы расположите на форме несколько переключателей vba OptionButton, то они будут между собой связаны, то есть вы сможете нажать одновременно только на один. Что бы создать отдельную группу объектов OptionButton, их нужно поместить в отдельную рамку или на отдельную вкладку.
Основные свойства для переключателя следующие:
Name – имя объекта, оно назначается автоматически в стиле: OptionButton1, OptionButton2, … , OptionButtonN. Но вы можете переименовать объект так, как вам подходит.
Caption – надпись, которая будет отображаться рядом с переключателем, при добавлении на форму компонента OptionButton в vba, свойство caption автоматически принимает такое же значение как и свойство Name.
Enabled – позволяет сделать активным и доступным (значение true) объект, или наоборот, сделать объект неактивным и недоступным (значение false).
Value – содержит логическое значение: true – элемент управления включен (вы нажали на переключатель) или false – элемент управления выключен.
Visible – определяет видимость объект, принимает логическое true – отображать или false – не отображать компонент.
Как и для большинства управляющих компонентов, для OptionButton главным событием vba является Change – событие возникает при включении/выключении радио-кнопки.
Хорошо, теперь давайте приступим к практике. Добавим в проект новую форму (я ее назвал OBForm) и новый модуль (OBModule), за добавление отвечает меню Insert, пункты UserForm и Module.
В окне свойств для формы (UserForm) установите следующие значения:
- Caption – работа с компонентом OptionButton
- Width – 320
- Height – 134
Далее надо добавить на поверхность формы четыре переключателя, пусть они будут в одном столбике, справа от них добавьте один под другим два текстовых поля TextBox (соответственно TestBox1 и TextBox2), а под ними одну простую кнопку (CommandButton). Как все должно выглядеть можете посмотреть на рисунке.
Как и прежде, в редакторе кода для модуля следует прописать следующую процедуру:
Sub OBModule() OBForm.Show End Sub
Тут мы просто указываем, что при запуске макроса должна отобразиться форма, Show — показать.
Хорошо, теперь немного о логике работы: возле каждого переключателя прописано имя элемента, при выборе заданного объекта OptionButton в vba (или RadioButton), в первом текстовом поле (TextBox1) должно отобразиться описание для выбранного элемента управления. При нажатии на кнопку во втором текстовом поле (TextBox2) должно отобразиться значение свойства Caption выбранного объекта OptionButton.
Хорошо, теперь пропишем в окне редактора кода для формы следующие процедуры:
Private Sub CommandButton1_Click() Dim ctrl As Control For Each ctrl In OBForm.Controls If ctrl.Value = True Then TextBox2.Text = ctrl.Caption End If Next End Sub Private Sub OptionButton1_Change() TextBox1.Text = "" TextBox1.Text = "CommandButton - работа с кнопками" End Sub Private Sub OptionButton2_Change() TextBox1.Text = "" TextBox1.Text = "CheckBox - создание флажков" End Sub Private Sub OptionButton3_Change() TextBox1.Text = "" TextBox1.Text = "ListBox - формирование списка с данными" End Sub Private Sub OptionButton4_Change() TextBox1.Text = "" TextBox1.Text = "TextBox - добавление на форму текстового поля" End Sub
Теперь проанализируем код:
CommandButton1_Click – тут происходит обработка клика по кнопке. В цикле for … each происходит перебор коллекции всех объектов OptionButton и происходит проверка значения свойства Value, если оно ровно true – значит, элемент выбран. Во второе текстовое поле будет записываться значение свойства Caption для выбранного объекта.
Процедуры от OptionButton1_Change до OptionButton4_Change обрабатывают событие Change. Как только мы выберем переключатель OptionButton в VBA, в первое текстовое поле запишется текстовая строка. Строка TextBox1.Text = «» фактически является лишней, так как содержимое текстового поля автоматически затирается при присвоении свойству Text нового текста.
Элемент управления OptionButton
Переключатель OptionButton подобен флажку CheckBox, так как он тоже позволяет отображать и выбирать значение типа True/False или да/нет. Обычно переключатель имеет вид маленького кружка, внутри которого отображается (если переключатель выбран) или не отображается (если переключатель не выбран) черная точка. Щелкая на переключателе, пользователь выбирает его или отменяет его выбор. Отличие переключателя OptionButton от флажка CheckBox состоит в том, что из группы может быть выбран только один переключатель (тогда как флажков, принадлежащих одной группе, допускается выбрать сразу несколько).
рис . 1.1 Элемент управления OptionButton на панели ToolBox
рис. 2.2 Элемент управления OptionButton на форме
рис. 2.3 Пример элемента управления OptionButton на форме
Чтобы создать группу переключателей, поместите их на элементе управления Frame. Обратите внимание, что вначале необходимо добавить в окно формы панель Frame, а затем разместить на ней переключатели OptionButton. Чтобы сделать переключатель частью группы, его сразу же следует поместить на панель Frame. Таким образом перетащить уже созданный переключатель из окна формы на панель вы не сможете.
Еще один способ создания группы переключателей состоит в использовании свойства GroupName. Все элементы управления OptionButton, свойство GroupName которых имеет одинаковое значение, считаются частью одной группы. Выбор одного такого переключателя исключает возможность выбора других, даже если они не расположены на одной панели.
Присвоение свойству Value переключателя значения True сопровождается автоматическим присвоением значения False этому же свойству других переключателей, относящихся к данной группе. Чтобы определить, какой переключатель группы был выбран, программа должна просмотреть все элементы OptionButton и найти тот из них, свойству Value которого присвоено значение True.
Напишем небольшой тестовый пример. Для начала кинем на форму два компонента OptionButton, один из них назовем opPlus, другой opMinus. И дадим имена: “Сложение” и “Вычитание” соответственно. У объекта opPlus установим в true свойство value*:
Теперь добавим два текстовых поля (TextBox), с именами txNumber1 и txNumber2, текст у них очистим. Еще нам понадобиться кнопочка (CommandButton). Назовем ее cmDo и назначим заголовок “Действие”. Вот что должно в итоге получиться*:
Теперь напишем для кнопочки обработчик нажатия:
Private Sub cmDo_Click()
If opPlus.Value = True Then
MsgBox (Val(txNumber1.Text) + Val(txNumber2.Text))
End If
If opMinus.Value = True Then
MsgBox (Val(txNumber1.Text) – Val(txNumber2.Text))
End If
End Sub
Данная программа у нас проверяет, какой вариант выбран, сложение или вычитание и делает с числом соответствующее действие. Главной особенностью кнопки OptionButton в том, что невозможно выбрать сразу две кнопочки. Запустите программу и убедитесь в этом сами:
Добавим еще и умножение. Для этого кинем на форму еще один OptionButton с именем opMult и заголовком “Умножить”. Добавим несколько строчек в нашу программу:
Private Sub cmDo_Click()
If opPlus.Value = True Then
MsgBox (Val(txNumber1.Text) + Val(txNumber2.Text))
End If
If opMinus.Value = True Then
MsgBox (Val(txNumber1.Text) – Val(txNumber2.Text))
End If
If opMult.Value = True Then
MsgBox (Val(txNumber1.Text) * Val(txNumber2.Text))
End If
End Sub
Запустим программу и убедимся, что она работает правильно: