ВГОРУ

VBA-Урок 12.4. Елементи управління (Вправи)

YouLibreCalc for Excel logo

Давайте зараз розглянемо невелику вправу, щоби попрактикуватись у використанні елементів управління (Controls).


Є файл з готовою формою та елементами управління. Потрібно написати код, який би заставив запрацювати всі елементи таким чином, щоби користувач міг наповнювати нашу імпровізовану базу даних через взаємодію з формою.

Ось файл Excel для завантаження: controls_exercise.xls

Тепер має бути ясно, що мета тут полягає у заповненні таблиці, використовуючи форму.

Кілька моментів, які потрібно взяти до уваги:

  • Перелік країн базується на списку, що знаходиться на другому аркуші;
  • Перевірка значень елементів управління перед додаванням нового контакту;
  • Після введення значень, повернення початкових значень елементів управління без закриття форми.
  • Один із способів розв'язання задачі

    Спочатку, нам необхідно збільшити властивість Zoom нашої форми до 120, щоби зробити її легшою у використанні:

    Ми вже розглянули перевірку кнопок вибору опцій (option button) (на першому уроці по елементам управління), отож тут ми використовюємо просте рішення.

    "Mrs" вибираємо по замовчуванню (властивість Value: True), тобто ми не будемо перевіряти звертання при його виборі.

    Кнопка закриття (Close)

    Private Sub CommandButton_Close_Click()
         Unload Me
    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()
         'Встановлення кольору назви в чорний
         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 = номер рядка останньої непорожньої клітинки в стовпці +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() 'Список з 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