TOP

VBA-Lecția 12.3. Controale (Controls)

Controalele (Controls) pot fi utilizate și în afara formularelor. În exemplul următor, vom folosi controalele direct pe foaia de lucru.

Rețineți că „Modul Designer” („Design mode”) trebuie activat pentru a modifica un anumit control aflat pe foaia de lucru (și trebuie de asemenea dezactivat pentru a utiliza acest control).


Scrollbar (ScrollBar)

Înainte de a privi următorul exemplu, să ne uităm la acesta:

Acum, dorim să adăugăm o culoare de fundal celulelor și să le selectăm în funcție de poziția glisorului într-o zonă definită de 30 de rânduri pe 10 coloane.

Proprietățile glisorului vertical pentru derularea ecranului sunt următoarele:

  • Min : 1
  • Max : 30 (30 de rânduri)
  • Value : poziția cursorului (în acest caz, între 1 și 30)
  • Glisorul orizontal este același, cu excepția Max : 10.

    Următorul este codul care va rula ori de câte ori valoarea glisorului vertical (Value) se schimbă:

     'Fundal gri în celule
     Cells.Interior.Color = RGB(240, 240, 240)
    
     'Aplicăm culoare și selectăm o celulă
     With Cells(ScrollBar_vertical.Value, ActiveCell.Column) 'Definiți celula folosind Valoare (Value)
         .Interior.Color = RGB(255, 220, 100) 'Folosim culoarea portocalie
         .Select 'Selectăm o celulă
     End With
    

    Acest cod este declanșat atunci când apar evenimentele Change și Scroll și execută instrucțiuni indiferent de partea pe care am făcut clic pe glisor.

    Următorul este codul pentru glisorul vertical:

    Private Sub vertical_bar()
         'Aplicați un fundal gri pentru celule
         Cells.Interior.Color = RGB(240, 240, 240)
         
         'Aplicați fundalul și selectați celula
         With Cells(ScrollBar_vertical.Value, ActiveCell.Column)
             .Interior.Color = RGB(255, 220, 100) 'Portocale
             .Select 'Selectăm o celulă
         End With
    End Sub
    
    Private Sub ScrollBar_vertical_Change()
         vertical_bar
    End Sub
    
    Private Sub ScrollBar_vertical_Scroll()
         vertical_bar
    End Sub
    

    Și iată, la rândul său, codul pentru glisorul orizontal:

    Private Sub horizontal_bar()
         'Aplicați un fundal gri pentru celule
         Cells.Interior.Color = RGB(240, 240, 240)
    
         'Aplicați fundalul și selectați celula
         With Cells(ActiveCell.Row, ScrollBar_horizontal.Value)
             .Interior.Color = RGB(255, 220, 100) 'Portocale
             .Select 'Selectăm o celulă
         End With
    End Sub
    
    Private Sub ScrollBar_horizontal_Change()
         horizontal_bar
    End Sub
    
    Private Sub ScrollBar_horizontal_Scroll()
         horizontal_bar
    End Sub
    

    Meniu derulant și ListBox (ComboBox și ListBox)

    Acesta este punctul de plecare pentru următorul nostru exemplu:

    Puteți descărca fișierul exemplu Excel: userform4.xls

    Când rulăm formularul, dorim ca cele 4 țări să fie încărcate în lista verticală (folosind metoda AddItem):

    Private Sub UserForm_Initialize()
         For i = 1 To 4 '=> pentru a umple 4 țări
            ComboBox_Country.AddItem Cells(1, i) 'Adăugăm valorile celulelor de la A1 la A4 folosind o buclă
        Next
    End Sub
    

    Când valoarea meniului derulant se modifică, dorim să adăugăm orașele țării selectate folosind o buclă similară celei precedente.

    Pentru a face acest lucru, trebuie să cunoaștem numărul coloanei, precum și numărul de orașe (rânduri) din această coloană.

    Proprietatea ListIndex conține numărul de secvență al elementului selectat din lista verticală (spre deosebire de Value, care conține valoarea articolului din listă). Rețineți că ListIndex începe cu numărul 0.

    Numărul coloanei se obține prin:

    column_number = ComboBox_Country.ListIndex + 1
    

    Pentru a obține numărul de rânduri din coloana selectată pentru o anumită țară, putem găsi numărul ultimei celule nevide:

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

    Folosind aceste informații, acum este posibil să creați o buclă pentru a adăuga orașele pe listă:

    Private Sub ComboBox_Country_Change()
         'Ștergerea listei (în caz contrar, orașele vor fi adăugate imediat)
         ListBox_Cities.Clear
         
         Dim column_number As Integer, rows_number As Integer
         
         'Numărul de secvență al elementului selectat (ListIndex începe cu 0):
         column_number = ComboBox_Country.ListIndex + 1
         'Numărul de rânduri din coloana selectată cu țări:
         rows_number = Cells(1, column_number).End(xlDown).Row
    
         For i = 2 To rows_number '=> completarea listei cu orașe
            ListBox_Cities.AddItem Cells(i, column_number)
         Next
    End Sub
    

    Notă: Am putea scurta codul, dar asta l-ar face mai puțin lizibil:

    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
    

    Orașul pe care îl alegem va fi introdus în câmpul de text „Alegere” (“Choice”):

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

    Puteți vedea un exemplu terminat în acest fișier Excel: userform4b.xls