VBA-Урок 12.2. Элементы управления (Controls)

Элементы управления имеют все виды свойств и много событий связанных с ними, но сейчас мы лишь рассмотрим несколько из них, которые используются в 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

Вот результат:

Checkboxes

Далее пример как использовать 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

Кнопки опций (Option Buttons)

Пользователь может выбрать только одну кнопку-опцию на "группу" в отличие от чекбоксов.

Чтобы создать "группу", сначала вставьте 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

Статьи по теме:

  • VBA-Урок 12.1. Пользовательские формы (UserForm)
  • VBA-Урок 12.3. Элементы управления (Controls)