TOP
VBA-Урок 12.4. Элементы управления (Упражнения)
Давайте теперь рассмотрим небольшое упражнение, чтобы попрактиковаться в использовании элементов управления.
Есть файл с готовой формой и элементами управления. Нужно написать код, который бы заставил заработать все элементы таким образом, чтобы пользователь мог наполнять нашу импровизированную базу данных через взаимодействие с формой.
Здесь есть Excel файл для загрузки: controls_exercise.xls
Теперь должно быть ясно, что цель здесь заключается в заполнении таблицы, используя форму.
Несколько моментов, которые нужно принять во внимание:
- Перечень стран базируется на списке , которий находится на втором листе;
- Проверка значений элементов управления перед добавлением нового контакта;
- После ввода значений, возврат начальных значений элементов управления без закрытия формы.
Один из способов решения задачи
Сначала, нам необходимо увеличить свойство Zoom нашей формы до 120, чтобы сделать ее более легкой в использовании:
Мы уже рассмотрели проверку кнопок выбора опций (option button) (на первом уроке по элементам управления), поэтому здесь мы используем простое решение.
"Mrs" выбираем по умолчанию (свойство Value: True), то есть мы не будем проверять обращение при его выборе.
Кнопка закриття (Close)
- Private Sub CommandButton_Close_Click()
- Unload Me
- End Sub
Private Sub CommandButton_Close_Click()
Unload Me
End Sub
Содержание выпадающего списка
- Private Sub UserForm_Initialize ()
- For i = 1 To 252
- ComboBox_Country.AddItem Sheets ("Country"). Cells (i, 1)
- Next
- End Sub
Private Sub UserForm_Initialize () 'Загрузка списка, когда форма открыта
For i = 1 To 252 'Формирование списка из 252 стран с рабочего листа "Country"
ComboBox_Country.AddItem Sheets ("Country"). Cells (i, 1)
Next
End Sub
Проверка элементов управления
Было бы простым решением открыть диалоговое окно, если любой из элементов управления является пустым.
- Private Sub CommandButton_Add_Click()
- If TextBox_Last_Name.Value = "" Or TextBox_First_Name.Value = "" Or TextBox_Address.Value = "" Or TextBox_Place.Value = "" Or ComboBox_Country.Value = "" Then
- MsgBox "Form incomplete"
- Else
-
- End If
- End Sub
Private Sub CommandButton_Add_Click()
If TextBox_Last_Name.Value = "" Or TextBox_First_Name.Value = "" Or TextBox_Address.Value = "" Or TextBox_Place.Value = "" Or ComboBox_Country.Value = "" Then
MsgBox "Form incomplete"
Else
'Инструкции для внесения контакта здесь...
End If
End Sub
Но, чтобы сделать немного сложнее, каждый элемент нужно проверять отдельно, и если любой из них пустой, цвет его названия () должен меняться на красный:
- Private Sub CommandButton_Add_Click()
-
- Label_Last_Name.ForeColor = RGB(0, 0, 0)
- Label_First_Name.ForeColor = RGB(0, 0, 0)
- Label_Address.ForeColor = RGB(0, 0, 0)
- Label_Place.ForeColor = RGB(0, 0, 0)
- Label_Country.ForeColor = RGB(0, 0, 0)
-
-
- If TextBox_Last_Name.Value = "" Then
- Label_Last_Name.ForeColor = RGB(255, 0, 0)
- ElseIf TextBox_First_Name.Value = "" Then
- Label_First_Name.ForeColor = RGB(255, 0, 0)
- ElseIf TextBox_Address.Value = "" Then
- Label_Address.ForeColor = RGB(255, 0, 0)
- ElseIf TextBox_Place.Value = "" Then
- Label_Place.ForeColor = RGB(255, 0, 0)
- ElseIf ComboBox_Country.Value = "" Then
- Label_Country.ForeColor = RGB(255, 0, 0)
- Else
-
- End If
- End Sub
Private Sub CommandButton_Add_Click()
'Установка цвета названия в черный
Label_Last_Name.ForeColor = RGB(0, 0, 0)
Label_First_Name.ForeColor = RGB(0, 0, 0)
Label_Address.ForeColor = RGB(0, 0, 0)
Label_Place.ForeColor = RGB(0, 0, 0)
Label_Country.ForeColor = RGB(0, 0, 0)
'Content controls
If TextBox_Last_Name.Value = "" Then 'ЕСЛИ ничего не указано...
Label_Last_Name.ForeColor = RGB(255, 0, 0) 'Установить цвет названия в красный
ElseIf TextBox_First_Name.Value = "" Then
Label_First_Name.ForeColor = RGB(255, 0, 0)
ElseIf TextBox_Address.Value = "" Then
Label_Address.ForeColor = RGB(255, 0, 0)
ElseIf TextBox_Place.Value = "" Then
Label_Place.ForeColor = RGB(255, 0, 0)
ElseIf ComboBox_Country.Value = "" Then
Label_Country.ForeColor = RGB(255, 0, 0)
Else
'Инструкции для внесения контакта здесь...
End If
End Sub
Установка данных
Следующий код должен быть вставлен в место, указанное в коде выше (см. комментарии):
- Dim row_number As Integer, salutation As String
-
-
- For Each salutation_button In Frame_Salutation.Controls
- If salutation_button.Value Then
- salutation = salutation_button.Caption
- End If
- Next
-
-
- row_number = Range("A65536").End(xlUp).Row + 1
-
-
- Cells(row_number, 1) = salutation
- Cells(row_number, 2) = TextBox_Last_Name.Value
- Cells(row_number, 3) = TextBox_First_Name.Value
- Cells(row_number, 4) = TextBox_Address.Value
- Cells(row_number, 5) = TextBox_Place.Value
- Cells(row_number, 6) = ComboBox_Country.Value
-
-
- OptionButton1.Value = True
- TextBox_Last_Name.Value = ""
- TextBox_First_Name.Value = ""
- TextBox_Address.Value = ""
- TextBox_Place.Value = ""
- ComboBox_Country.ListIndex = -1
Dim row_number As Integer, salutation As String
'Выбор обращения
For Each salutation_button In Frame_Salutation.Controls
If salutation_button.Value Then
salutation = salutation_button.Caption 'Обращение выбрано
End If
Next
'row_number = номер строки последней непустой ячейки в столбце +1
row_number = Range("A65536").End(xlUp).Row + 1
'Установка значений в рабочий лист
Cells(row_number, 1) = salutation
Cells(row_number, 2) = TextBox_Last_Name.Value
Cells(row_number, 3) = TextBox_First_Name.Value
Cells(row_number, 4) = TextBox_Address.Value
Cells(row_number, 5) = TextBox_Place.Value
Cells(row_number, 6) = ComboBox_Country.Value
'После установки, начальные значения возвращаются
OptionButton1.Value = True
TextBox_Last_Name.Value = ""
TextBox_First_Name.Value = ""
TextBox_Address.Value = ""
TextBox_Place.Value = ""
ComboBox_Country.ListIndex = -1
Общий вид
Это все, здесь вы имеете завершенный код для упражнения и файл для загрузки:
- Private Sub CommandButton_Close_Click()
- Unload Me
- End Sub
-
- Private Sub UserForm_Initialize()
- For i = 1 To 252
- ComboBox_Country.AddItem Sheets("Country").Cells(i, 1)
- Next
- End Sub
-
- Private Sub CommandButton_Add_Click()
-
- Label_Last_Name.ForeColor = RGB(0, 0, 0)
- Label_First_Name.ForeColor = RGB(0, 0, 0)
- Label_Address.ForeColor = RGB(0, 0, 0)
- Label_Place.ForeColor = RGB(0, 0, 0)
- Label_Country.ForeColor = RGB(0, 0, 0)
-
-
- If TextBox_Last_Name.Value = "" Then
- Label_Last_Name.ForeColor = RGB(255, 0, 0)
- ElseIf TextBox_First_Name.Value = "" Then
- Label_First_Name.ForeColor = RGB(255, 0, 0)
- ElseIf TextBox_Address.Value = "" Then
- Label_Address.ForeColor = RGB(255, 0, 0)
- ElseIf TextBox_Place.Value = "" Then
- Label_Place.ForeColor = RGB(255, 0, 0)
- ElseIf ComboBox_Country.Value = "" Then
- Label_Country.ForeColor = RGB(255, 0, 0)
- Else
-
- Dim row_number As Integer, salutation As String
-
-
- For Each salutation_button In Frame_Salutation.Controls
- If salutation_button.Value Then
- salutation = salutation_button.Caption
- End If
- Next
-
-
- row_number = Range("A65536").End(xlUp).Row + 1
-
-
- Cells(row_number, 1) = salutation
- Cells(row_number, 2) = TextBox_Last_Name.Value
- Cells(row_number, 3) = TextBox_First_Name.Value
- Cells(row_number, 4) = TextBox_Address.Value
- Cells(row_number, 5) = TextBox_Place.Value
- Cells(row_number, 6) = ComboBox_Country.Value
-
-
- OptionButton1.Value = True
- TextBox_Last_Name.Value = ""
- TextBox_First_Name.Value = ""
- TextBox_Address.Value = ""
- TextBox_Place.Value = ""
- ComboBox_Country.ListIndex = -1
- End If
- End Sub
Private Sub CommandButton_Close_Click()
Unload Me
End Sub
Private Sub UserForm_Initialize() 'Список из 252 стран на листе "Country"
For i = 1 To 252
ComboBox_Country.AddItem Sheets("Country").Cells(i, 1)
Next
End Sub
Private Sub CommandButton_Add_Click()
'Установка цвета названия черный
Label_Last_Name.ForeColor = RGB(0, 0, 0)
Label_First_Name.ForeColor = RGB(0, 0, 0)
Label_Address.ForeColor = RGB(0, 0, 0)
Label_Place.ForeColor = RGB(0, 0, 0)
Label_Country.ForeColor = RGB(0, 0, 0)
'Элементы управлением содержанием
If TextBox_Last_Name.Value = "" Then 'ЕСЛИ ничего не указано...
Label_Last_Name.ForeColor = RGB(255, 0, 0) 'Установить цвет названия в красный
ElseIf TextBox_First_Name.Value = "" Then
Label_First_Name.ForeColor = RGB(255, 0, 0)
ElseIf TextBox_Address.Value = "" Then
Label_Address.ForeColor = RGB(255, 0, 0)
ElseIf TextBox_Place.Value = "" Then
Label_Place.ForeColor = RGB(255, 0, 0)
ElseIf ComboBox_Country.Value = "" Then
Label_Country.ForeColor = RGB(255, 0, 0)
Else
'Если форма заполнена, значения будут вставлены на рабочий лист
Dim row_number As Integer, salutation As String
'Выбор обращения
For Each salutation_button In Frame_Salutation.Controls
If salutation_button.Value Then
salutation = salutation_button.Caption
End If
Next
'row_number = номер строки последней непустой ячейки в столбце +1
row_number = Range("A65536").End(xlUp).Row + 1
'Установка значений на рабочий лист
Cells(row_number, 1) = salutation
Cells(row_number, 2) = TextBox_Last_Name.Value
Cells(row_number, 3) = TextBox_First_Name.Value
Cells(row_number, 4) = TextBox_Address.Value
Cells(row_number, 5) = TextBox_Place.Value
Cells(row_number, 6) = ComboBox_Country.Value
'После установки данных, возвращаем начальные значения
OptionButton1.Value = True
TextBox_Last_Name.Value = ""
TextBox_First_Name.Value = ""
TextBox_Address.Value = ""
TextBox_Place.Value = ""
ComboBox_Country.ListIndex = -1
End If
End Sub
Здесь есть Excel файл для загрузки: controls_exercise2.xls
Статьи по теме:
VBA-Урок 12.3. Элементы управления (Controls)
VBA-Урок 13.1. Использование массивов (Arrays)