TOP

VBA-Lekcja 12.3. Sterowanie (Controls)

Kontroli (Controls) można używać także poza formularzami. W poniższym przykładzie użyjemy kontrolek bezpośrednio w arkuszu.

Należy pamiętać, że „Tryb projektanta” („Design mode”) musi być aktywowany, aby móc modyfikować konkretną kontrolkę znajdującą się w arkuszu (i musi być również dezaktywowany, aby móc korzystać z tej kontrolki).


Pasek przewijania (ScrollBar)

Zanim przejdziemy do następnego przykładu, spójrzmy na to:

Teraz chcemy dodać kolor tła do komórek i wybrać je na podstawie położenia suwaka w określonym obszarze 30 wierszy na 10 kolumn.

Właściwości pionowego suwaka służącego do przewijania ekranu są następujące:

  • Min : 1
  • Max : 30 (30 rzędów)
  • Value : pozycja suwaka (w tym przypadku od 1 do 30)
  • Suwak poziomy jest taki sam, z wyjątkiem Max : 10.

    Poniżej znajduje się kod, który zostanie uruchomiony za każdym razem, gdy zmieni się wartość pionowego suwaka (Value):

     'Szare tło w komórkach
     Cells.Interior.Color = RGB(240, 240, 240)
    
     'Nakładamy kolor i wybieramy komórkę
     With Cells(ScrollBar_vertical.Value, ActiveCell.Column) 'Zdefiniuj komórkę za pomocą wartości (Value)
         .Interior.Color = RGB(255, 220, 100) 'Używamy koloru pomarańczowego
         .Select 'Wybieramy komórkę
     End With
    

    Ten kod jest wyzwalany, gdy wystąpią zdarzenia Change i Scroll i wykonuje instrukcje niezależnie od tego, którą część suwaka kliknęliśmy.

    Poniżej znajduje się kod suwaka pionowego:

    Private Sub vertical_bar()
         'Zastosuj szare tło dla komórek
         Cells.Interior.Color = RGB(240, 240, 240)
         
         'Zastosuj tło i wybierz komórkę
         With Cells(ScrollBar_vertical.Value, ActiveCell.Column)
             .Interior.Color = RGB(255, 220, 100) 'Pomarańczowy
             .Select 'Wybieramy komórkę
         End With
    End Sub
    
    Private Sub ScrollBar_vertical_Change()
         vertical_bar
    End Sub
    
    Private Sub ScrollBar_vertical_Scroll()
         vertical_bar
    End Sub
    

    A oto z kolei kod suwaka poziomego:

    Private Sub horizontal_bar()
         'Zastosuj szare tło dla komórek
         Cells.Interior.Color = RGB(240, 240, 240)
    
         'Zastosuj tło i wybierz komórkę
         With Cells(ActiveCell.Row, ScrollBar_horizontal.Value)
             .Interior.Color = RGB(255, 220, 100) 'Pomarańczowy
             .Select 'Wybieramy komórkę
         End With
    End Sub
    
    Private Sub ScrollBar_horizontal_Change()
         horizontal_bar
    End Sub
    
    Private Sub ScrollBar_horizontal_Scroll()
         horizontal_bar
    End Sub
    

    Lista rozwijana i ListBox (ComboBox i ListBox)

    To jest punkt wyjścia dla naszego następnego przykładu:

    Możesz pobrać przykładowy plik Excel: userform4.xls

    Chcemy, aby przy uruchomieniu formularza na listę rozwijaną wczytały się 4 kraje (przy pomocy metody AddItem):

    Private Sub UserForm_Initialize()
         For i = 1 To 4 '=> aby wypełnić 4 kraje
            ComboBox_Country.AddItem Cells(1, i) 'Wartości komórek od A1 do A4 dodajemy za pomocą pętli
        Next
    End Sub
    

    Kiedy wartość rozwijanego menu ulegnie zmianie, chcemy dodać miasta wybranego kraju za pomocą pętli podobnej do poprzedniej.

    Aby to zrobić, musimy znać numer kolumny, a także liczbę miast (wierszy) w tej kolumnie.

    Właściwość ListIndex zawiera numer kolejny wybranego elementu z listy rozwijanej (w przeciwieństwie do właściwości Value, która zawiera wartość elementu listy). Należy pamiętać, że ListIndex zaczyna się od cyfry 0.

    Numer kolumny uzyskuje się poprzez:

    column_number = ComboBox_Country.ListIndex + 1
    

    Aby uzyskać liczbę wierszy w wybranej kolumnie dla konkretnego kraju, możemy znaleźć numer ostatniej niepustej komórki:

    rows_number = Cells(1, column_number).End(xlDown).Row
    

    Korzystając z tych informacji, można teraz utworzyć pętlę dodającą miasta do listy:

    Private Sub ComboBox_Country_Change()
         'Czyszczenie listy (w przeciwnym razie miasta zostaną dodane od razu)
         ListBox_Cities.Clear
         
         Dim column_number As Integer, rows_number As Integer
         
         'Numer kolejny wybranego elementu (ListIndex zaczyna się od 0):
         column_number = ComboBox_Country.ListIndex + 1
         'Liczba wierszy w wybranej kolumnie z krajami:
         rows_number = Cells(1, column_number).End(xlDown).Row
    
         For i = 2 To rows_number '=> wypełnienie listy miastami
            ListBox_Cities.AddItem Cells(i, column_number)
         Next
    End Sub
    

    Uwaga: Moglibyśmy skrócić kod, ale byłoby to mniej czytelne:

    Private Sub ComboBox_Country_Change()
         ListBox_Cities.Clear
         For i = 2 To Cells(1, ComboBox_Country.ListIndex + 1).End(xlDown).Row
             ListBox_Cities.AddItem Cells(i, ComboBox_Country.ListIndex + 1)
         Next
    End Sub
    

    Wybrane przez nas miasto zostanie wpisane w polu tekstowym „Wybór” („Choice”):

    Private Sub ListBox_Cities_Click()
         TextBox_Choice.Value = ListBox_Cities.Value
    End Sub
    

    Gotowy przykład możesz zobaczyć w tym pliku Excel: userform4b.xls