Tri d'adhérents en VBA
Bonjour tout le monde,
je suis débutant en vba et je m'initie sur VBA en créant une liste d'adhérent de ma salle de sport.
Dans ma liste d'adhérent, j'essaie de faire des tris mais la je bloque je ne sais pas comment programmer.
j'ai réussi a créer un bouton et je l'ai affecté à ma userform. j'ai créer les boutoon et les champs de saisie et liste déroulant en m'aidant du net.
Mais après je bloque pour le tri.
Pourriez vous m'aider svp.
Merci par avance,
Bonjour
Dans ma liste d'adhérent, j'essaie de faire des tris mais la je bloque je ne sais pas comment programmer.
Vous disposez d'une aide appréciable en utilisant l'outil Enregistreur automatique d'excel via le menu Développeur --> enregistrer une macro
Une fois effectué vous pouvez voir le code et recevoir une aide pour améliorer
NB : il n'y a pas d'Userform dans votre fichier
Autres sujets :
1. Une petite présentation ICI serait la bienvenue
2. Si vous ne l'avez pas encore fait, je vous invite à lire la charte du forum [A LIRE AVANT DE POSTER] ainsi que ses fonctionnalités
qui vous aideront dans vos demandes et réponses sur ce forum.
3. Pensez à mettre votre profit à jour. On ne connait pas la version d'excel que vous utilisez (2010, 2016, Excel MAC 2019, ...)
Crdlt
Merci DAN,
J'ai enregistré sans prendre en charge la macro c'est probablement pour cela que le Userform n'y était pas.
je le remets en pièce jointe pour que vous compreniez ce que je veux faire.
Merci de votre aide.
Bonjour,
Mais dans votre userform il n'y a aucun codes
Donc expliquez ce que vous voulez faire lorsque vous parlez de Tri.
entre temps faites ceci déjà
- Allez dans votre module et remplacer la macro Filtre par ceci (vous devriez choisir un autre nom que filtrer. exemple : ChargeUSF)
Sub filter()
Load UserForm1
UserForm1.Show
End Sub- allez dans votre Userform et coller ce code
Private Sub UserForm_Initialize()
ComboBox1.List = Sheets("Adherents").Range("E2:E4").Value
End SubVotre combobox2 sert à quoi ?
En attendant votre retour sur plus d'explications
Merci Dan de ton retour,
Ma combobox2 c'est pour choisir le type de sport que pratique les adhérents.
J'ai initialisé ma combobox2 en utilisant ton exemple et ça à fonctionner.
Donc je voudrai filtrer en fonction de tous les critères dans l'UserForm:
Sexe, Date (selection l'année : ex 2022 remonter tous les adhérents entrée en 2022),Nom, Prénom, Code (type de sport pratiqué) et enfin l'adresse.
J'espère que j'ai aider un chouiya clair
Merci bcp de votre aide
Sexe, Date (selection l'année : ex 2022 remonter tous les adhérents entrée en 2022),Nom, Prénom, Code (type de sport pratiqué) et enfin l'adresse.
Je ne vois pas trop non.
Votre userform sert juste à entrer les données. Le tri ne sert à rien dans ce cas et à ce moment là.
Si vous voulez trier n'oubliez pas que vous pouvez le faire via le filtre installé en ligne 6.
Exemple: cliquez sur la petit flèche en B6 puis choisir 2022
Sinon faites ce que je vous ai dit avant. Utilisez l'enregistreur automatique d'excel, faites vos manipulation de tri puis postez le code dans votre réponse. je regarderai
J'ai initialisé ma combobox2 en utilisant ton exemple et ça à fonctionner.
Oui mais juste un truc, ne mettez pas E5 dans la définition de la combobox1 sinon cela vous ajoute un vide dans la liste. Votre liste va jusque E4
J'ai fais un copie écran et j 'ai simuler ce que je voulais faire.
Dans le Userform, si je saisis Sexe=F et Code=1 il doit me rechercher les adhérents correspondant à ces critères.
j'ai utilisé avec l enregisteur de macros mais je ne sais pas comment l'affecter et en plus la macro enregistre un tri précis.
Je veux utiliser cette méthode pour que cela soit plus facile à mon équipe de gérer les adhérents voilà pourquoi je n'utilse cette méthode (Exemple: cliquez sur la petit flèche en B6 puis choisir 2022)
Merce de ton aide.
Bonjour,
Ok. J'avais compris que votre bouton Valider (devenu Rechercher dans votre vue) était utilisé pour entrer les informations dans votre feuille
Le code est presque terminé mais j'ai besoin de savoir ce que doit faire le bouton remise à zéro. Est-ce pour réafficher le tableau complet dans la feuille ou pour vider l'USF
Autre question : le fichier posté est votre bon fichier ?
Cette question parce que si vous rajouter d'autres sport vous allez devoir insérer des lignes avant votre tableau et là votre code devra changer.
Habituellement on évite de placer les références comme vous l'avez fait.
Cordialement
Bonjour Dan,
Le bouton remise à zéro sert à réafficher le tableau en entier.
oui c'est le bon tableau il n'y aura pas de sport supplémentaire.
Merci bcp pour votre aide.
Re,
Bon voici les codes à placer dans l'ordre dans votre fichier
1. Tout en haut des codes mettez ces deux instructions (donc en première ligne de l'USF)
Option Explicit
Option Compare Text2. remise à zéro
Private Sub CommandButton1_Click()
Call Reinit
End Sub3. Code recherche
Private Sub CommandButton2_Click()
Dim lgsexe As Integer, lgcode As Integer
Dim i As Byte
Dim ctrl As Control
Dim plage As Range
Call Reinit
With Sheets("Adherents")
Set plage = .Range("A6:F" & .UsedRange.Rows.Count)
End With
For Each ctrl In Me.Controls
Select Case TypeName(ctrl)
Case "TextBox"
If ctrl <> vbNullString Then
Select Case Right(ctrl.Name, 1)
Case Is = 4: i = 6
Case 2, 3: i = Right(ctrl.Name, 1) + 1
Case Is = 1
If Len(TextBox1) <> 4 Then MsgBox "L'année doit comporter 4 chiffres", , "Annee": TextBox1 = "": Exit Sub
plage.AutoFilter Field:=2, Operator:=xlFilterValues, Criteria2:=Array(0, "12/31/" & TextBox1.Value)
End Select
On Error Resume Next
plage.AutoFilter Field:=i, Criteria1:=ctrl.Value
On Error GoTo 0
End If
Case "ComboBox"
With Sheets("Adherents")
If ctrl.Name = "ComboBox1" And ctrl <> vbNullString Then
lgsexe = ComboBox1.ListIndex + 2
plage.AutoFilter Field:=1, Criteria1:=.Range("D" & lgsexe)
End If
If ctrl.Name = "ComboBox2" And ctrl <> vbNullString Then
lgcode = ComboBox2.ListIndex + 2
plage.AutoFilter Field:=5, Criteria1:=.Range("A" & lgcode)
End If
End With
End Select
Next ctrl
End Sub4. Code Initialize (vous l'aviez déjà mais je vous le redonne)
Private Sub UserForm_Initialize()
With Sheets("Adherents")
ComboBox1.List = .Range("E2:E4").Value
ComboBox2.List = .Range("B2:B5").Value
End With
End Sub5. Code pour défiltrer le tableau
Private Sub Reinit()
With Sheets("Adherents")
If Not .AutoFilterMode Then .Range("A6:F6").AutoFilter
On Error Resume Next
.ShowAllData
On Error GoTo 0
End With
End SubFaite un test
Si ok -->
Cordialement
Merci bcp Dan,
Ton code fonctionne super bien sauf un petit truc.
Si je mets le code "2 et 4" cela ne marche pas . ça me renvoi aucune ligne.
J'ai essayer de mettre '2 et 4 dans le tableau pour prise en compte mais cela ne marche toujours pas.
re
ne remettez pas votre fichier à chaque fois. J'ai celui de travail ici
Pour le 2 et 4, c'est normal. cela ne fonctionnera pas.
Le mieux est de faire deux lignes lorsque vous ajoutez des sports. C'est le principe d'une base de données
Re,
Désolé pour le fichier.
Ok pour les deux lignes pour le code sport 2 et 4.
Une dernière question et je t embête plus.
Si je veux plus tard le même userform et code dans le même fichier mais dans un autre onglet comment faire pour éviter de reproduire le userform et les boutons tous en gardant le même code et me même fonctionnement dans l autre onglet (ex: onglets adhérents déjà programmer et un autre onglet article).
Est ce qu'il y a une solution pour éviter de tout recréer et renommer les userform...?
re
Désolé pour le fichier.
Pas de souci. Je l'ai supprimé
Si je veux plus tard le même userform et code dans le même fichier mais dans un autre onglet comment faire pour éviter de reproduire le userform et les boutons tous en gardant le même code et me même fonctionnement dans l autre onglet (ex: onglets adhérents déjà programmer et un autre onglet article).
Oui c'est toujours possible. Exemple comme ceci :
- Ouvrez votre fichier contenant l'Userform
- Ouvrez un nouveau fichier
- allez dans l'éditeur VBA puis faite éventuellement CTRL + R (pour afficher l'explorateur VBA project si vous ne le voyez pas)
- cliquez sur votre Userform1 et déplacez là dans le nouveau fichier
- Renommez là dans ce nouveau fichier (exemple Userform2)
- Cliquez sur l'Userform2 et déplacez là dans votre premier fichier
Mais si vous avez une autre feuille de même structure et qui utilise la même Userform, on peut peut-être utiliser la même userform pour les deux. A voir ce que vous voulez faire
Cordialement
merci Bcp tu m'as bcp aider.
Tout tes explications étaient clair et merci pour ta réactivité et ton aide précieuse.
Merci pour ce forum qui est d'une grande aide pour la communauté Excel expert et débutant.
re Dan,
Oui c'est toujours possible. Exemple comme ceci :
- Ouvrez votre fichier contenant l'Userform
- Ouvrez un nouveau fichier
- allez dans l'éditeur VBA puis faite éventuellement CTRL + R (pour afficher l'explorateur VBA project si vous ne le voyez pas)
- cliquez sur votre Userform1 et déplacez là dans le nouveau fichier
- Renommez là dans ce nouveau fichier (exemple Userform2)
- Cliquez sur l'Userform2 et déplacez là dans votre premier fichier
j'ai utiliser cette technique pour tester et ça marche presque.
Le souci c'est que les texbox ne gardent pas les mêmes nom.
Exemple: Si le champe Sexe s'appelle Texbox1 quand je le mets dans l'autre onglets il est automatiquement renommer en Texbox5 par exemple.
Comment faire stp pour garder le même texbox pour éviter de rechanger le code?
Oubli le dernier message DAN.
C'est moi qui est fait une mauvaise manip.
Tout est ok.
A bientot.
Merci
bonjour Dan,
j'ai essayé d'analyser ton compte et je n'ai pas tout compris.
Pourrais tu m'expliquer ou mettre un commentaire stp?
Merci par avance
Private Sub CommandButton2_Click()
Dim lgsexe As Integer, lgcode As Integer
Dim i As Byte
Dim ctrl As Control
Dim plage As Range
Call Reinit
With Sheets("Adherents")
Set plage = .Range("A6:F" & .UsedRange.Rows.Count)
End With
For Each ctrl In Me.Controls
Select Case TypeName(ctrl)
Case "TextBox"
If ctrl <> vbNullString Then
Select Case Right(ctrl.Name, 1)
Case Is = 4: i = 6
Case 2, 3: i = Right(ctrl.Name, 1) + 1
Case Is = 1
If Len(TextBox1) <> 4 Then MsgBox "L'année doit comporter 4 chiffres", , "Annee": TextBox1 = "": Exit Sub
plage.AutoFilter Field:=2, Operator:=xlFilterValues, Criteria2:=Array(0, "12/31/" & TextBox1.Value)
End Select
On Error Resume Next
plage.AutoFilter Field:=i, Criteria1:=ctrl.Value
On Error GoTo 0
End If
Case "ComboBox"
With Sheets("Adherents")
If ctrl.Name = "ComboBox1" And ctrl <> vbNullString Then
lgsexe = ComboBox1.ListIndex + 2
plage.AutoFilter Field:=1, Criteria1:=.Range("D" & lgsexe)
End If
If ctrl.Name = "ComboBox2" And ctrl <> vbNullString Then
lgcode = ComboBox2.ListIndex + 2
plage.AutoFilter Field:=5, Criteria1:=.Range("A" & lgcode)
End If
End With
End Select
Next ctrl
End SubBonjour à tous,
je n'ai pas eu de réponse à mon dernier message c'est pour cela que je me permets de faire un relance.
Dan a produit mon code et je lui en remercie mais je voudrai qu'on m'explique le code ou qu'on me mette un commentaire pour me facilité la compréhension et la MàJ.
Merci de votre aide.
Bonjour
Désolé du retard à vous répondre mais j'ai été absent
Voici les explications
Private Sub CommandButton2_Click()
'définir variables
Dim lgsexe As Integer, lgcode As Integer
Dim i As Byte
Dim ctrl As Control
Dim plage As Range
Call Reinit 'appel code reinit
With Sheets("Adherents")
Set plage = .Range("A6:F" & .UsedRange.Rows.Count) 'nommer la plage entre A6 et la dernière ligne de la colonne F
End With
For Each ctrl In Me.Controls 'boucle sur tous les objets de l'USF
Select Case TypeName(ctrl) 'type d'objet
Case "TextBox" 'objet textbox
If ctrl <> vbNullString Then 'on verifie que la textbox est complétée
Select Case Right(ctrl.Name, 1) 'on récupère le dernier caractère de l'objet textbox (chiffre 1, 2...)
Case Is = 4: i = 6 'si dernier caractère égal 4, la variable i vaut 6 (pour textbox6)
Case 2, 3: i = Right(ctrl.Name, 1) + 1 'si dernier caractère égal 2 ou 3, la variable i vaut la valeur du dernier caractère de la textbox auquel on ajoute 1
Case Is = 1 'si dernier caractère égal 1 (pour textbox1)
'on vérifie que l'année dans la textbox comporte 4 caractères.
'Le cas échéant le code envoie un message pour signaler que l'année doit avoir 4 chiffres et on sort de la macro
If Len(TextBox1) <> 4 Then MsgBox "l'année doit comporter 4 chiffres", , "Annee": TextBox1 = "": Exit Sub
'si l'année est bien complétée on filtre sur toutes les dates de l'année choisie
plage.AutoFilter Field:=2, Operator:=xlFilterValues, Criteria2:=Array(0, "12/31/" & TextBox1.Value)
End Select
On Error Resume Next 'gestion d'erreur
plage.AutoFilter Field:=i, Criteria1:=ctrl.Value 'filtre sur le champ de la variable i (définie ci-avant) et sur la valeur de la textbox
On Error GoTo 0 'annuler gestion d'erreur
End If
Case "ComboBox" 'objet Combobox
With Sheets("Adherents")
If ctrl.Name = "ComboBox1" And ctrl <> vbNullString Then 'condition de type objet est la combobox1 et que la combobox1 est complétée
lgsexe = ComboBox1.ListIndex + 2 'défini la ligne dans le tableau selon valeur choisie dans la combobox1
plage.AutoFilter Field:=1, Criteria1:=.Range("D" & lgsexe) 'filtre sur colonne 1 selon critère dans colonne D de la ligne lgsexe
End If
If ctrl.Name = "ComboBox2" And ctrl <> vbNullString Then 'condition de type objet est la combobox1 et que la combobox2 est complétée
lgcode = ComboBox2.ListIndex + 2 'défini la ligne dans le tableau selon valeur choisie dans la combobox2
plage.AutoFilter Field:=5, Criteria1:=.Range("A" & lgcode) 'filtre sur colonne 1 selon critère dans colonne D de la ligne lgcode
End If
End With
End Select
Next ctrl 'objet suivant
End SubCordialement