Rechercher dans ce blog

Nombre total de pages vues (en milliers)

EXCEL - FORMULAIRE AVEC DEUX LISTES DEROULANTES EN CASCADE


Depuis la création de ce blog, on m'a très souvent sollicité pour la création d'un formulaire permettant la recherche sur deux colonnes.

L'exemple le plus commun est de trouver la bonne ligne d'informations en fonction d'un NOM identique mais avec des prénoms différents.

Exemple :
DURAND Patrick
DURAND Pierre
DURAND Emile

C'est à dire trouver par exemple les informations qui correspondent à la ligne DURAND Pierre.


Sur la page "CREER son FORMULAIRE" le choix ne peut se faire qu'à partir d'une seule liste déroulante et vous allez y trouver plusieurs noms correspondant à DURAND.
Et si la liste est longue cela va être " la Galère".

Sur la base du fichier créé sur la page "CREER son FORMULAIRE", je vais vous programmer cette option.

CONSTRUCTION DU FORMULAIRE

Pour accéder au projet - VBAProject, cliquez simultanément sur Alt + f11

Maintenant insérez (comme expliquez "Créer dans son formulaire" dans le présent blog) :
* Deux ComboBox
* Sept TextBox
* Deux  CommandButton
* Neuf Label

avec la Boîte à outils :

Nommez vos Label respectivement dans Caption : 
* Rechercher NOM => Label1
* Prénom => Label2
* ADRESSE: => Label3
* Code Postal  => Label4
* Ville  => Label5
* N° Téléphone fixe => Label6
* N° de fax  => Label7
* Adresse mail   => Label8
* Observations : => Label9


Nommez vos CommandButton respectivement dans Caption : 
* QUITTER => CommandButtion1
* MODIFIER => CommandButtion2

Vous devriez arriver au résultat suivant :




PROGRAMMATION DU FORMULAIRE

Accédez au projet - VBAProject, cliquez simultanément sur Alt + f11
Cliquez deux fois sur le formulaire et ajoutez le code suivant dans un premier temps

Option Explicit

Dim Ws As Worksheet
Dim NbLignes As Integer


Private Sub UserForm_Initialize()
Set Ws = Worksheets("FICHIER ADRESSES")
    NbLignes = Ws.Range("A65536").End(xlUp).Row
   
    With Me.ComboBox2
      .ColumnCount = 2
      .ColumnWidths = "-1;0"
    End With
   
   InitCombo1 'Lance le programme InitCombo1 développé ci-desous
 End Sub



PROGRAMATION des listes déroulantes (COMBOBOX)

 

Cette petite programmation va initialiser la programmation de recherche via deux listes déroulantes.
A savoir un choix dans la 1ère liste déroulante pour le type de choix de plat et ensuite le nom du plat.



Cela s'appelle un  choix en "Cascade" mais faut-il encore rédiger la programmation.

Donc voici celle de la Combobox1 (A ajouter) :

Sub InitCombo1()
Dim J As Long
Dim Mondico As Object

  Set Mondico = CreateObject("Scripting.dictionary")
  For J = 2 To NbLignes
    Mondico(Ws.Range("A" & J).Value) = ""
  Next J
  With Me.ComboBox1
    .Clear
    If Mondico.Count > 0 Then
      .List = Application.Transpose(Mondico.keys)
    End If
  End With
End Sub



' Programme de la liste déroulante "NOM"
Private Sub ComboBox1_Change()
Dim J As Long

  Nettoyage    'Lance le programme Nettoyage
 
  Me.ComboBox2.Clear   'Efface les données de la combobox2
  If Me.ComboBox1.ListIndex = -1 Then Exit Sub
  With Me.ComboBox2
    For J = 2 To NbLignes
      If Ws.Range("A" & J) = Me.ComboBox1 Then
        .AddItem Ws.Range("B" & J)
        .List(.ListCount - 1, 1) = J
      End If
    Next J
  End With
 
End Sub


Après le choix dans la Combobox1 effectué,  le programme liste toutes les données dans la combobox2 en fonction du critère choisi dans la Combobox1  (Exemple : Liste tous les prénoms dans la Combobox2)

Dès lors que le choix s'effectue dans la Combobox2 (programme suivant : à ajouter), le formulaire se remplie en fonction du choix.

' Programme de la liste déroulante "Prénom"
Private Sub ComboBox2_Change()
Dim Ligne As Long
Dim I As Integer

  Nettoyage 'Lance le programme Nettoyage
  If Me.ComboBox2.ListIndex = -1 Then Exit Sub
  Ligne = Me.ComboBox2.List(Me.ComboBox2.ListIndex, 1)
  For I = 1 To 7
    Me.Controls("TextBox" & I) = Ws.Cells(Ligne, I )
  Next I

End Sub


 Vous avez peut être remarque dans la programmation Combobox2_Change  la phrase suivante :
 Nettoyage
 
Ce mot "Nettoyage" va lancer la programmation suivante à savoir effacer toutes les données de toutes les texbox du formulaire.... cela évite d'énumérer ceci : Texbox1 ="" et ainsi de suite, 
Cette programmation englobe  toutes les textbox via le Me.Controls

'Programmation de Nettoyage en effaçant les données de toutes les textbox
Sub Nettoyage()
Dim I As Integer
  For I = 1 To 7
    Me.Controls("TextBox" & I) = ""
  Next I
End Sub


On pourrait aussi programmer toutes les combobox soit Me.Controls("Combobox"&2) = ""  mais là n'est pas le sujet mais simplement l'explication.

Donc déjà à ce stade vous pouvez déjà effectuer un tri entre tous les types de NOM, et de Prénom et les informations remontent dans le formulaire....

PROGRAMATION du bouton MODIFIER (CommandButton2)

Cette petite programmation va initialiser la programmation pour la modification de la ligne sélectionné :

 Private Sub CommandButton2_Click()
If MsgBox("Etes-vous certain de vouloir modifier ce produit ?", vbYesNo, "Demande de confirmation") = vbYes Then
Dim Ligne As Long
Dim I As Integer
  If Me.ComboBox1.ListIndex = -1 Then Exit Sub
Ligne = Me.ComboBox2.List(Me.ComboBox2.ListIndex, 1)
 
  For I = 1 To 7
    If Me.Controls("TextBox" & I).Visible = True Then
      Ws.Cells(Ligne, I + 2) = Me.Controls("TextBox" & I)
    End If
  Next I
    End If
End Sub









3 commentaires :

  1. Bonjour,
    J'ai effectuer ce tutoriel et tout va bien sauf:
    Lorsque que je sélectionne le nom puis le prénom il ce réecrivent dans les deux textbox en dessous et décale tout donc de deux colonne
    Ainsi lorsque je fais modifier il recopie nom et prenom et le reste mais a partir de la colonne C ou lieu de partir de A B etc ....
    Pourriez vous m'aidez a comprend mon erreur ?
    En vous remerciant par avance

    RépondreSupprimer
  2. Bonjour, je tiens tout d'abord à vous remercier pour votre aide efficace et précieuse.
    J'ai un fichier Xls de plus de 100 colonnes, et j'aimerai construire un formulaire synthétique qui ne reprend qu'une trentaine de colonnes non consécutives,
    Comment rédiger la formule Vba ?
    Merci

    RépondreSupprimer
    Réponses
    1. Bonsoir
      S'il n'y a que des TextBox il suffit d'utiliser des boucles ou pas par rapport aux TextBox qui doivent correspondre au colonne.
      Donc dans le programme :
      Si l'on prend uniquement les données de la colonne B :
      Me.Textbox2 = Ws.cells(Ligne, 2)
      A suivre si l'on prend les données de la colonne D à G :
      For I = 4 To 7)
      Me.Controls("TextBox" & I) = Ws.Cells(Ligne, I )
      Next I

      et à suivre.... C'est complexe mais réalisable si l'on respecte cette procédure.
      Dans le cas contraire envoyez moi votre fichier (Onglet contact pour l'adresse mail) avec les colonnes choisie en couleurs
      Par contre deux lignes me suffisent (En tête de colonne et prermière ligne de données partiellement renseignée)
      A vous relire

      Supprimer

Pour vous aider à publier votre commentaire, voici la marche à suivre :
1) Ecrivez votre texte dans le formulaire de saisie ci-dessus
2) Si vous avez un compte, vous pouvez vous identifier dans la liste déroulante Commentaire
Sinon, vous pouvez saisir votre nom ou pseudo par Nom/URL
3) Vous pouvez, en cliquant sur le lien S'abonner par e-mail, être assuré d'être avisé en cas d'une réponse
4) Cliquer sur Publier enfin.

Le message sera publié après modération.
Merci