Cours VBA : les contrôles (partie 2)

Les boutons d'option (OptionButton)

Contrairement aux cases à cocher, l'utilisateur ne peut choisir qu'un seul bouton d'option par groupe.


Il faudra séparer ici les boutons d'option en 2 groupes puis enregistrer les résultats dans 2 cellules :

vba userform sondage boutons option controles suite

Le fichier : userform3.xlsm

La première étape consiste à créer les groupes de boutons (car pour le moment vous ne pouvez sélectionner qu'une seule réponse parmi les 8 réponses).

Pour faire cela, sélectionnez les 4 premiers contrôles et entrez une valeur dans la propriété GroupName :

vba userform boutons option groupes controles suite

Répétez ensuite l'opération pour les 4 autres contrôles (en entrant une valeur différente).

Vous pouvez à présent sélectionner une réponse par groupe.

Pour enregistrer les réponses dans les cellules de la feuille, nous allons tout d'abord ajouter l'événement Click du bouton Enregistrer.

Il faut ensuite ajouter une boucle pour chaque groupe de boutons d'option et enregistrer l'information lorsque la valeur du contrôle est True :

Private Sub CommandButton_valider_Click()

    Dim i As Integer
    
    'Question 1
    For i = 1 To 4
        If Controls("OptionButton_a_" & i) Then Range("A2") = Controls("OptionButton_a_" & i).Caption
    Next
    
    'Question 2
    For i = 1 To 4
        If Controls("OptionButton_b_" & i) Then Range("B2") = Controls("OptionButton_b_" & i).Caption
    Next
    
    'Fermeture
    Unload Me
    
End Sub
choix texte controles suite

Mais plutôt que d'enregistrer le choix au format texte, nous allons plutôt enregistrer son numéro (de 1 à 4) :

Private Sub CommandButton_valider_Click()

    Dim i As Integer
    
    'Question 1
    For i = 1 To 4
        If Controls("OptionButton_a_" & i) Then Range("A2") = i
    Next
    
    'Question 2
    For i = 1 To 4
        If Controls("OptionButton_b_" & i) Then Range("B2") = i
    Next
    
    'Fermeture
    Unload Me
    
End Sub
choix numero controles suite

Si l'on souhaite que le formulaire ne puisse être validé que lorsque l'utilisateur a répondu aux 2 questions, une solution consiste à enregistrer le choix de chaque groupe dans une variable, vérifier ensuite s'il y a un choix pour chacune des 2 variables et enregistrer les choix dans les cellules :

Private Sub CommandButton_valider_Click()

    Dim i As Integer, choix1 As Integer, choix2 As Integer
    
    'Question 1
    For i = 1 To 4
        If Controls("OptionButton_a_" & i) Then choix1 = i
    Next
    
    'Question 2
    For i = 1 To 4
        If Controls("OptionButton_b_" & i) Then choix2 = i
    Next
    
    'Si 2 réponses
    If choix1 > 0 And choix2 > 0 Then
        
        'Enregistrement
        Range("A2") = choix1
        Range("B2") = choix2
        
        'Fermeture
        Unload Me
    
    'Si une ou plusieurs réponses manquantes
    Else
        
        'Message d'erreur
        MsgBox "Vous devez répondre à toutes les questions avant de valider le formulaire.", 48, "Erreur"
        
    End If
    
End Sub

Le fichier : userform3b.xlsm

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.xlsm

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

Private Sub UserForm_Initialize()

    Dim i As Integer

    'Boucle pour ajouter les 4 pays à la liste déroulante
    For i = 1 To 4
        ComboBox_pays.AddItem Cells(1, i)
    Next
    
End Sub
vba liste deroulante pays controles suite

Au changement de sélection dans la liste déroulante, la liste des villes correspondant au pays choisi doit ensuite être affichée dans la zone de liste.

Pour faire cela, nous avons besoin de connaître le numéro de colonne ainsi que le nombre de villes de cette colonne.

La propriété ListIndex de la liste déroulante correspond au numéro de la sélection dans la liste (contrairement à la propriété Value qui correspond à la valeur au format texte).

Sachant que ListIndex commence à 0 (comme les tableaux), le numéro de colonne est donc :

colonne = ComboBox_Pays.ListIndex + 1

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

nbLignes = Cells(1, colonne).End(xlDown).Row

Grâce à ces informations, il est désormais possible de créer l'événement Change de la liste déroulante :

Private Sub ComboBox_Pays_Change()

    Dim colonne As Integer, nbLignes As Integer
    
    'Zone de liste vidée (sinon les villes sont ajoutées à la suite)
    ListBox_villes.Clear
    
    'Numéro de la sélection
    colonne = ComboBox_pays.ListIndex + 1
    
    'Si le numéro de colonne = 0 (donc si aucun pays sélectionné) la procédure est quittée
    If colonne = 0 Then Exit Sub
    
    'Nombre de lignes de la colonne du pays choisi
    nbLignes = Cells(1, colonne).End(xlDown).Row

    'Boucle pour ajouter les villes dans la zone de liste
    For i = 2 To nbLignes
        ListBox_villes.AddItem Cells(i, colonne)
    Next
    
End Sub

Il ne reste ensuite plus qu'à ajouter un événement au clic sur le bouton Valider pour traiter cette information. Dans ce cas, un simple affichage de la sélection dans une boîte de dialogue :

Private Sub CommandButton_valider_Click()
    
    MsgBox "Ville sélectionnée : " & ListBox_villes '(propriété Value de ListBox_villes)
    
End Sub
listes2 controles suite

Le fichier : userform4b.xlsm