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,

22liste-adherent.xlsx (12.46 Ko)

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.

10liste-adherent.xlsm (21.40 Ko)

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 Sub

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

recherche adherents

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 Text

2. remise à zéro

Private Sub CommandButton1_Click()
Call Reinit
End Sub

3. 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 Sub

4. 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 Sub

5. 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 Sub

Faite 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 Sub

Bonjour à 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 Sub

Cordialement

Rechercher des sujets similaires à "tri adherents vba"