Vous avez apprécié ?
Partagez ;-)

Cours VBA : les contrôles (suite)

Les barres de défilement (ScrollBar)

Les contrôles peuvent être utilisés en dehors des UserForms. Pour cet exemple, nous utiliserons les contrôles directement sur la feuille.

Notez tout d'abord que le "Mode Création" doit être activé pour modifier un contrôle placé sur une feuille (et désactivé pour utiliser le contrôle).

mode - controles suite

Pour les versions d'Excel inférieures à 2007 : bouton sur la barre "Boîte à outils Contrôles".

Avant de détailler cet exemple, en voici un aperçu :

sb - controles suite

L'objectif est de colorer et sélectionner une cellule grâce aux barres de défilement dans la zone définie de 30 lignes x 10 colonnes.

Les propriétés de la barre de défilement verticale :

  • Min : 1
  • Max : 30 (puisque 30 lignes)
  • Value : position de la barre (entre 1 et 30 ici)

Même chose avec la barre horizontale avec un Max à 10 ...

Voici le code qui sera appliqué à chaque changement de valeur (Value) de la barre verticale :

'Couleur grise sur les cellules
Cells.Interior.Color = RGB(240, 240, 240)

'Couleur et sélection de la cellule
With Cells(ScrollBar_verticale.Value, ActiveCell.Column) 'Cellule par rapport à Value
    .Interior.Color = RGB(255, 220, 100) 'Couleur orange
    .Select 'Sélection de la cellule
End With

Ce code sera exécuté avec les événements Change et Scroll pour lancer les instructions quelle que soit la partie de la barre de défilement qui est cliquée.

Voici le code pour la barre verticale :

Private Sub barre_verticale()
    'Couleur grise sur les cellules
    Cells.Interior.Color = RGB(240, 240, 240)
   
    'Couleur et sélection de la cellule
    With Cells(ScrollBar_verticale.Value, ActiveCell.Column)
        .Interior.Color = RGB(255, 220, 100) 'Orange
        .Select 'Sélection de la cellule
    End With
End Sub

Private Sub ScrollBar_verticale_Change()
    barre_verticale
End Sub

Private Sub ScrollBar_verticale_Scroll()
    barre_verticale
End Sub

Et celui de la barre horizontale :

Private Sub barre_horizontale()
    'Couleur grise sur les cellules
    Cells.Interior.Color = RGB(240, 240, 240)

    'Couleur et sélection de la cellule
    With Cells(ActiveCell.Row, ScrollBar_horizontale.Value)
        .Interior.Color = RGB(255, 220, 100) 'Orange
        .Select 'Sélection de la cellule
    End With
End Sub

Private Sub ScrollBar_horizontale_Change()
    barre_horizontale
End Sub

Private Sub ScrollBar_horizontale_Scroll()
    barre_horizontale
End Sub

Le fichier : scrollbar.xls

La liste déroulante (ComboBox) et la zone de liste (ListBox)

Voici le point de départ de ce nouvel exemple :

listes - controles suite

Le fichier : userform4.xls

Au lancement de l'UserForm, nous voulons que les 4 pays soient chargés dans la liste déroulante (avec la méthode AddItem) :

Private Sub UserForm_Initialize()
    For i = 1 To 4 ' => pour lister les 4 pays
       ComboBox_Pays.AddItem Cells(1, i) 'Ajoute les valeurs des cellules A1 à D1 avec la boucle
   Next
End Sub

Au changement de valeur de la liste déroulante, nous voulons ajouter les villes correspondant au pays choisi avec une boucle semblable à celle ci-dessus.

Pour le faire, nous avons besoin du n° de colonne et du nombre de lignes.

La propriété ListIndex correspond au n° de la sélection dans la liste (contrairement à Value qui correspond à la valeur), à noter que ListIndex commence à 0.

Le n° de colonne est donc :

no_colonne = ComboBox_Pays.ListIndex + 1

Pour obtenir le nombre de lignes de la colonne du pays choisi, nous pouvons rechercher le n° de ligne de la dernière cellule d'un bloc de cellules non vides :

nb_lignes = Cells(1, no_colonne).End(xlDown).Row

Grâce à ces informations, il est désormais possible de créer la boucle pour ajouter les villes dans la zone de liste :

Private Sub ComboBox_Pays_Change()
    'Zone de liste vidée (sinon les villes sont ajoutées à la suite)
    ListBox_Villes.Clear
   
    Dim no_colonne As Integer, nb_lignes As Integer
   
    'Numéro de la sélection (ListIndex commence à 0) :
    no_colonne = ComboBox_Pays.ListIndex + 1
    'Nombre de lignes de la colonne du pays choisi :
    nb_lignes = Cells(1, no_colonne).End(xlDown).Row

    For i = 2 To nb_lignes ' => pour lister les villes
       ListBox_Villes.AddItem Cells(i, no_colonne)
    Next
End Sub

Remarque : nous pourrions réduire le code ci-dessus, néanmoins cela rendrait sa lecture plus difficile :

Private Sub ComboBox_Pays_Change()
    ListBox_Villes.Clear
    For i = 2 To Cells(1, ComboBox_Pays.ListIndex + 1).End(xlDown).Row
        ListBox_Villes.AddItem Cells(i, ComboBox_Pays.ListIndex + 1)
    Next
End Sub

La ville choisie est ensuite entrée dans la zone de texte :

Private Sub ListBox_Villes_Click()
    TextBox_Choix.Value = ListBox_Villes.Value
End Sub
listes2 - controles suite

Le fichier : userform4b.xls

Aller plus loin

N'oubliez pas qu'avec l'aide Excel vous pouvez obtenir des informations rapidement sur les différentes propriétés et événements des contrôles (entre autres).

En voici un aperçu avec la recherche du contrôle Label :

aide - controles suite

L'aide Excel est très riche en informations, n'hésitez pas à l'utiliser en cas de besoin ...