Элементы управления имеют все виды свойств и много событий связанных с ними, но сейчас мы лишь рассмотрим несколько из них, которые используются в VBA программировании:
Давайте начнем с добавления 3-х элементов управления - Label , TextBox и CommandButton :
Давайте сейчас отредактируем название и свойства этого элемента управления (используя свойство Caption , которое содержит текст). Мы хотим получить следующий результат:
Сейчас, когда мы введем номер и нажмем ОК - ничего не произойдет.
Чтобы создать какое-то событие, мы начнем добавлять событие, которое введет значение из текстового окна в ячейки А1 и закроет Форму.
Вы можете получить доступ к опциям, которые показаны ниже, дважды щелкнув по элементу управления:
Данный выпадающий список содержит различные элементы управления и эту Форму.
Выберите кнопку (Button) и событие Click:
Private Sub CommandButton_validate_Click() Range("A1") = Textbox_number.Value 'Textbox_number является названием текстового окна (text box) 'Value является свойством, содержащим значения текстового окна Unload Me 'Unload закрывает форму (UserForm) 'Мы используем Me вместо названия формы (потому что, этот код есть в середине UserForm, которую мы хотим закрыть) End Sub
Введенное значение сейчас уже будет сохранено в ячейке А1 перед закрытием этой Формы ( UserForm ).
Добавьте вторую подпись (Label) и измените следующие свойства: Caption , Forecolor (color: red) and Visible (False, чтобы скрыть элемент управления по умолчанию) :
Теперь давайте добавим событие, которое будет запускаться, когда значение в поле будет изменено. Событие отобразит сообщение об ошибке, если значение не является цифровым.
Private Sub Textbox_number_Change () If IsNumeric (Textbox_number.Value) Then 'ЕСЛИ является цифровым значением ... Label_error.Visible = False 'Название (Label) скрытое Else 'иначе ... Label_error.Visible = True 'Название отображается End If End Sub
Введенное значение будет тестироваться каждый раз при вводе очередного символа.
Нам еще нужно предотвратить валидацию формы, если значение не является числом.
Private Sub CommandButton_validate_Click () If IsNumeric (Textbox_number.Value) Then 'ЕСЛИ является цифровым значением ... Range ("A1") = Textbox_number.Value 'копируем в A1 Unload Me 'закрывает Else 'иначе ... MsgBox "Incorrect value" "Неправильное значение End If End Sub
Для того, чтобы не оставлять правую сторону формы пустой, когда там нет сообщения об ошибке, мы можем уменьшить её размер, откорректировав свойство Width этой формы:
Private Sub Textbox_number_Change () If IsNumeric (Textbox_number.Value) Then 'ЕСЛИ является цифровым значением ... Label_error.Visible = False 'Название (Label) скрытое Me.Width = 156 'Ширина формы Else 'иначе ... Label_error.Visible = True 'Название отображается Me.Width = 244 'Ширина формы End If End Sub
Вы можете скачать Excel файл с примером: userform1.xls
Вот результат:
Далее пример как использовать CheckBox :
Когда чекбокс отмеченный/неотмеченный, значение связанной ячейки может быть изменено из-за использования события Click:
Private Sub CheckBox1_Click () 'Номер 1 If CheckBox1.Value = True Then 'ЕСЛИ выбрано ... Range ("A2") = "Checked" Else 'ЕСЛИ не выбрано ... Range ("A2") = "Unchecked" End If End Sub Private Sub CheckBox2_Click () 'Номер 2 If CheckBox2.Value = True Then 'ЕСЛИ выбрано ... Range ("B2") = "Checked" Else 'ЕСЛИ не выбрано ... Range ("B2") = "Unchecked" End If End Sub Private Sub CheckBox3_Click () 'Номер 3 If CheckBox3.Value = True Then 'ЕСЛИ выбрано ... Range ("C2") = "Checked" Else 'ЕСЛИ не выбрано ... Range ("C2") = "Unchecked" End If End Sub
В этом примере, чекбокс стартует неотмеченным, когда Форма открывается впервые.
Чтобы проверить бокс когда значения соответствующих ячеек является & quot; Отмечено & quot;, мы запустим проверку когда форму активировано, используя UserForm_Initialize:
Private Sub UserForm_Initialize() 'Если поставлена "галочка" If Range("A2") = "Checked" Then CheckBox1.Value = True End If If Range("B2") = "Checked" Then CheckBox2.Value = True End If If Range("C2") = "Checked" Then CheckBox3.Value = True End If End Sub
Здесь вы можете посмотреть пример в готовом Excel файле: userform2.xls
Пользователь может выбрать только одну кнопку-опцию на "группу" в отличие от чекбоксов.
Чтобы создать "группу", сначала вставьте Frame, а затем OptionButton :
Здесь вы можете посмотреть пример в готовом Excel файле: userform3.xls
Как только форма была отправлена, мы введем данные в ячейку, которая связана с названием колонки и row_value chosen.
Для того, чтобы знать какие опции были выбраны, мы могли бы сделать то же самое что и в предыдущем примере (с чекбоксами), но мы используем цикл, чтобы уменьшить размер кода.
Мы собираемся использовать цикл For Each , тип цикла, который мы еще до этого не рассматривали. Этот цикл позволяет выполнять инструкции для каждого объекта в "группе объектов":
Private Sub CommandButton1_Click () Dim column_value As String, row_value As String 'Цикл для каждого элемента управления Frame_column For Each column_button In Frame_column.Controls "Если значение элем. управления = True (тогда, если выбрано) ... If column_button.Value Then 'Переменная "column_value" принимает значение текста кнопки column_value = column_button.Caption End If Next 'Цикл для другого блока For Each row_button In Frame_row.Controls If row_button.Value Then row_value = row_button.Caption End If Next Range (column_value & row_value) = "Cell chosen!" 'Ячейка выбрана Unload Me End Sub
Сейчас эта форма вводит значение "Ячейка выбрана!" в ячейку, которая была выбрана.
Чтобы избежать баги, нам необходимо проверить , что пользователь выбрал правильно с двух наборов опций.
В этом примере, когда форма еще не завершена, кнопка "Подтверждение" ("Confirm") появится в сером (будет деактивирована). Это не самое простое решение, но это хороший пример того, почему функции/процедуры является Полезные внутри формы (UserForm).
Измените текст и свойство Enabled , чтобы деактивировать кнопку.
Результат будет следующий:
В предыдущем коде мы использовали два For Each цикла, чтобы получить значение опционных кнопок (option buttons). Сейчас нам нужно использовать те же значения для кнопки "Подтверждение" ("Confirm") и событие Click для десяти опций.
Для этого нам не нужно копировать циклы для каждого события, мы вызовем их через функцию.
Начнем с предыдущего кода и модифицируя его, мы достигнем этого результата:
Private Function column_value() 'Функция, которая возвращает текстовое значение для выбранной кнопки (column_value) For Each column_button In Frame_column.Controls If column_button.Value Then column_value = column_button.Caption End If Next End Function Private Function row_value() 'Функция, которая возвращает текстовое значение для выбранной кнопки (row_value) For Each row_button In Frame_row.Controls If row_button.Value Then row_value = row_button.Caption End If Next End Function Private Sub CommandButton1_Click () 'Действие, происходит при нажатии "Confirm your selection" ("Подтвердите свой выбор") Range (column_value & row_value) = "Cell chosen!" 'column_value и row_value являются значениями, которые возвращаються этими функциями Unload Me End Sub
Все что нам осталось сделать, это создать процедуру, которая проверяет , что кнопки опций были выбраны корректно (через вызов двух функций), и которые активируют эту кнопку когда нужно.
Опять же, проверка выполняется в отдельной процедуре, чтобы избежать копирования кода 10 раз для каждого события каждого опционной кнопки:
Private Sub activate_button () 'Активация кнопки, если условие успешно проверено If column_value <> "" And row_value <> "" Then 'column_value и row_value являются значениями, которые возвращаються этими функциями CommandButton1.Enabled = True CommandButton1.Caption = "Confirm your selection" End If End Sub Private Sub OptionButton11_Click () activate_button 'Запускаем процедуру "activate_button" End Sub Private Sub OptionButton12_Click() activate_button End Sub Private Sub OptionButton13_Click() activate_button End Sub Private Sub OptionButton14_Click() activate_button End Sub Private Sub OptionButton15_Click() activate_button End Sub Private Sub OptionButton16_Click() activate_button End Sub Private Sub OptionButton17_Click() activate_button End Sub Private Sub OptionButton18_Click() activate_button End Sub Private Sub OptionButton19_Click() activate_button End Sub Private Sub OptionButton20_Click() activate_button End Sub
Здесь вы можете посмотреть пример в готовом Excel файле: userform3b.xls