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
Bonjour,
RépondreSupprimerJ'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
Bonjour, je tiens tout d'abord à vous remercier pour votre aide efficace et précieuse.
RépondreSupprimerJ'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
Bonsoir
SupprimerS'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