TOP

VBA-Lekcja 12.4. Elementy sterujące (Ćwiczenia)

Przyjrzyjmy się teraz małemu ćwiczeniu ćwiczącemu korzystanie z elementów sterujących (Controls).


Znajduje się w nim plik z gotowym formularzem i elementami sterującymi. Musimy napisać kod, który sprawi, że wszystkie elementy będą działać tak, aby użytkownik mógł zapełnić naszą zaimprowizowaną bazę danych poprzez interakcję z formularzem.

Oto plik Excel do pobrania: controls_exercise.xls

Powinno być teraz jasne, że celem jest wypełnienie tabeli za pomocą formularza.

Kilka punktów do rozważenia:

  • Lista krajów opiera się na liście znajdującej się na drugim arkuszu;
  • Sprawdzenie wartości elementów sterujących przed dodaniem nowego kontaktu;
  • Po wprowadzeniu wartości zwrócenie początkowych wartości kontrolek bez zamykania formularza.
  • Jeden ze sposobów rozwiązania problemu

    Najpierw musimy zwiększyć właściwość Zoom naszego formularza do 120, aby ułatwić korzystanie z niego:

    Sprawdzanie przycisków opcji omówiliśmy już (w pierwszej lekcji o sterowaniu), więc tutaj zastosujemy proste rozwiązanie.

    Domyślnie wybrana jest „Pani” (właściwość Value: True), czyli przy jej wyborze nie sprawdzimy adresu.

    Przycisk Zamknij

    Private Sub CommandButton_Close_Click()
         Unload Me
    End Sub
    

    Zawartość listy rozwijanej

    Private Sub UserForm_Initialize() 'Ładowanie listy przy otwartym formularzu
        For i = 1 To 252 'Generowanie listy 252 krajów z arkusza Kraj
           ComboBox_Country.AddItem Sheets("Country").Cells(i, 1)
        Next
    End Sub
    

    Sprawdzanie elementów sterujących

    Prostym rozwiązaniem byłoby wyświetlenie okna dialogowego, jeśli którakolwiek z kontrolek jest pusta.

    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
             'Instrukcje dotyczące wprowadzania kontaktu tutaj...
         End If
    End Sub
    

    Ale żeby było trochę bardziej skomplikowanie, każdy element należy sprawdzić osobno i jeśli któryś z nich jest pusty, kolor jego nazwy () powinien zmienić się na czerwony:

    Private Sub CommandButton_Add_Click()
         'Ustaw kolor tytułu na czarny
         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)
    
         'Kontrola treści
         If TextBox_Last_Name.Value = "" Then 'JEŚLI nic nie jest określone...
             Label_Last_Name.ForeColor = RGB(255, 0, 0) 'Ustaw kolor tytułu na czerwony
         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
             'Instrukcje dotyczące wprowadzania kontaktu tutaj...
         End If
    End Sub
    

    Wstawianie danych

    W miejscu wskazanym w kodzie powyżej należy wstawić następujący kod (patrz uwagi):

     Dim row_number As Integer, salutation As String
    
     'Wybór odwołania
     For Each salutation_button In Frame_Salutation.Controls
         If salutation_button.Value Then
             salutation = salutation_button.Caption 'Wybrano odwołanie
         End If
     Next
    
     'row_number = numer wiersza ostatniej niepustej komórki w kolumnie +1
     row_number = Range("A65536").End(xlUp).Row + 1
    
     'Wstawianie wartości do arkusza
     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
    
     'Po wklejeniu zwracane są oryginalne wartości
     OptionButton1.Value = True
     TextBox_Last_Name.Value  = ""
     TextBox_First_Name.Value = ""
     TextBox_Address.Value    = ""
     TextBox_Place.Value      = ""
     ComboBox_Country.ListIndex = -1
    

    Ogólny wygląd

    To wszystko, tutaj masz kompletny kod ćwiczenia i plik do pobrania:

    Private Sub CommandButton_Close_Click()
         Unload Me
    End Sub
    
    Private Sub UserForm_Initialize() 'Lista 252 krajów w arkuszu „Kraj”.
        For i = 1 To 252
            ComboBox_Country.AddItem Sheets("Country").Cells(i, 1)
        Next
    End Sub
    
    Private Sub CommandButton_Add_Click()
         'Ustaw kolor nazwy na czarny
         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)
    
         'Kontrola treści
         If TextBox_Last_Name.Value = "" Then 'JEŚLI nic nie jest określone...
             Label_Last_Name.ForeColor = RGB(255, 0, 0) 'Ustaw kolor tytułu na czerwony
         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
             'Jeśli formularz zostanie wypełniony, wartości zostaną wklejone do arkusza
             Dim row_number As Integer, salutation As String
             
             'Wybór odwołania
             For Each salutation_button In Frame_Salutation.Controls
                 If salutation_button.Value Then
                     salutation = salutation_button.Caption
                 End If
             Next
    
             'row_number = numer wiersza ostatniej niepustej komórki w kolumnie +1
             row_number = Range("A65536").End(xlUp).Row + 1
    
             'Wstawianie wartości do arkusza
             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
             
             'Po wstawieniu danych zwracamy wartości początkowe
             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
    

    Oto plik Excel do pobrania: controls_exercise2.xls