Effectifs de classe sur plusieurs feuilles

Résolu/Fermé
maxime2935 - 8 sept. 2021 à 11:16
cs_Le Pivert Messages postés 7904 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 14 août 2024 - 1 sept. 2022 à 09:07
Bonjour à tous,
J'ai un tableau d'effectif global de l'école et j'aimerais dispatcher dans les feuilles les données par niveau.
Exemple :
1e feuille = données de toute l'école (en simplifiant : colonne A = nom, colonne B = niveau, colonne C = coordonnées)
2e feuille = reprendre exactement les même données, mais seulement pour les CP
3e feuille = idem pour les CE1
4e feuille = idem pour les CE2
etc....
Quel code VBA utiliser?
Merci d'avance pour votre aide!

8 réponses

cs_Le Pivert Messages postés 7904 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 14 août 2024 729
Modifié le 8 sept. 2021 à 11:55
Bonjour,

a mettre dans un module et associer à un bouton ou un raccourci clavier

Option Explicit
Sub For_X_to_Next_Ligne()
Dim FL1 As Worksheet, NoCol As Integer
Dim NoLig As Long, Var As Variant
Dim DerniereLigneUtilisee As Long
    Set FL1 = Worksheets("Feuil1")
    NoCol = 2 'lecture de la colonne B
    For NoLig = 2 To Split(FL1.UsedRange.Address, "$")(4)
    
        Var = FL1.Cells(NoLig, NoCol)
        Select Case Var
        Case Is = "CP"
        DerniereLigneUtilisee = Worksheets("Feuil2").Range("A" & Rows.Count).End(xlUp).Row + 1
       FL1.Range("A" & NoLig & ":C" & NoLig).Copy _
    Destination:=Worksheets("Feuil2").Range("A" & DerniereLigneUtilisee)
        Case Is = "CE1"
              DerniereLigneUtilisee = Worksheets("Feuil3").Range("A" & Rows.Count).End(xlUp).Row + 1
        FL1.Range("A" & NoLig & ":C" & NoLig).Copy _
    Destination:=Worksheets("Feuil3").Range("A" & DerniereLigneUtilisee)
        Case Is = "CE2"
              DerniereLigneUtilisee = Worksheets("Feuil4").Range("A" & Rows.Count).End(xlUp).Row + 1
        FL1.Range("A" & NoLig & ":C" & NoLig).Copy _
    Destination:=Worksheets("Feuil4").Range("A" & DerniereLigneUtilisee)
        End Select
    Next
    Set FL1 = Nothing
End Sub


-

-
@+ Le Pivert
0
Bonjour,
Merci pour ta réponse,
mais rien ne se passe quand je lance le code... :(
Bonne journée
0
cs_Le Pivert Messages postés 7904 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 14 août 2024 729 > maxime2935
8 sept. 2021 à 14:27
Il faut adapter le code à ton environnement: nom des feuilles , colonnes correspondantes et casse
0
M-12 Messages postés 1331 Date d'inscription lundi 22 septembre 2008 Statut Membre Dernière intervention 8 avril 2023 284
8 sept. 2021 à 12:04
Bonjour,
Un exemple à mettre à ta sauce
https://www.cjoint.com/c/KIikevCCyRK
0
Bonjour et merci pour ta réponse. Ca marche super bien.
Par contre, si je veux ajouter d'autres colonnes pour rentrer d'autres données, comment faire pour qu'elles soient aussi prises en compte dans les feuilles?
Et est-il possible de faire en sorte que, dans les feuilles, les élèves soient triés dans l'ordre alphabétique de leur adresse?
Par ailleurs, quand j'ouvre le développeur, je ne vois que les macros qui concernent les CE2. Je ne vois pas ce qu'il faut faire pour voir les autres?
Merci et bonne journée!
0
M-12 Messages postés 1331 Date d'inscription lundi 22 septembre 2008 Statut Membre Dernière intervention 8 avril 2023 284
Modifié le 8 sept. 2021 à 13:55
Peut-être savoir à qui tu réponds?
et de plus placer un classeur exemple ressemblant à l'original avec données non confidentielles
0
C'était bien à toi M-12 que je répondais. ;)
Encore merci.
Je te rejoins mon fichier complet (j'ai enlevé les données confidentielles) :
https://www.cjoint.com/c/KIimO4Pm07c
J'aimerais qu'on mette dans la feuille 2 (1CA) tous les élèves qui ont niveau "1CA" de la colonne H. Feuille 3 (1CB), ceux de 1CB, etc... jusque 2CF. Et en les triant par ordre alphabétique du nom de famille à chaque fois.
Ensuite, j'aimerais qu'on mette dans la feuille "flûte" tous les élèves qui sont inscrits en "flûte" de la colonne (I), puis tous ceux de saxophone dans la feuille "saxophone", etc... Et en les triant par ordre de niveau (colonne J).
Voilà exactement ce que j'attends... Désolé d'avoir fait en plusieurs fois, mais je pensais que ce serait plus simple........
Bonne journée
0
Merci pour vos réponse.
Je vous rejoins mon fichier complet (j'ai enlevé les données confidentielles) :
https://www.cjoint.com/c/KIimO4Pm07c
J'aimerais qu'on mette dans la feuille 2 ("1CA") tous les élèves qui ont niveau "1CA" de la colonne H notés sur la feuille 1 ("global"). Sur la feuille 3 ("1CB"), ceux de 1CB, etc... jusque 2CF. Et en les triant par ordre alphabétique du nom de famille à chaque fois.
Ensuite, j'aimerais qu'on mette dans la feuille "flûte" tous les élèves qui sont inscrits en "flûte" de la colonne I de la feuille 1 ("global"), puis tous ceux de saxophone dans la feuille "saxophone", etc... Et en les triant par ordre de niveau (colonne J).
Voilà exactement ce que j'attends... Désolé d'avoir fait en plusieurs fois, mais je pensais que ce serait plus simple........
Merci par avance pour votre aide......! Je galère!!!!!!!
Bonne journée
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Toujours personne pour m'aider..... :(
0
cs_Le Pivert Messages postés 7904 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 14 août 2024 729
Modifié le 9 sept. 2021 à 16:18
Je t'avais donné une base de travail, mais cela n'a pas eu l'air de t'intéresser!

je retente la chose avec les classes. Il te suffira de l'adapter pour les instruments de musique

a mettre dans un module:

Option Explicit
Sub boucleclasse()
Dim FL1 As Worksheet, NoCol As Integer
Dim NoLig As Long, Var As Variant
Dim DerniereLigneUtilisee As Long
    Set FL1 = Worksheets("GLOBAL")
    NoCol = 8 'lecture de la colonne H
    For NoLig = 3 To Split(FL1.UsedRange.Address, "$")(4)
     Var = FL1.Cells(NoLig, NoCol)
        Select Case Var
        Case Is = "1CA"
        DerniereLigneUtilisee = Worksheets("FM1CA").Range("A" & Rows.Count).End(xlUp).Row + 1
       FL1.Range("A" & NoLig & ":AR" & NoLig).Copy _
    Destination:=Worksheets("FM1CA").Range("A" & DerniereLigneUtilisee)
        Case Is = "1CB"
              DerniereLigneUtilisee = Worksheets("FM1CB").Range("A" & Rows.Count).End(xlUp).Row + 1
        FL1.Range("A" & NoLig & ":AR" & NoLig).Copy _
    Destination:=Worksheets("FM1CB").Range("A" & DerniereLigneUtilisee)
        Case Is = "1CC"
              DerniereLigneUtilisee = Worksheets("FM1CC").Range("A" & Rows.Count).End(xlUp).Row + 1
        FL1.Range("A" & NoLig & ":AR" & NoLig).Copy _
    Destination:=Worksheets("FM1CC").Range("A" & DerniereLigneUtilisee)
        Case Is = "1CF"
        DerniereLigneUtilisee = Worksheets("FM1CF").Range("A" & Rows.Count).End(xlUp).Row + 1
       FL1.Range("A" & NoLig & ":AR" & NoLig).Copy _
    Destination:=Worksheets("FM1CF").Range("A" & DerniereLigneUtilisee)
        Case Is = "2CA"
              DerniereLigneUtilisee = Worksheets("FM2CA").Range("A" & Rows.Count).End(xlUp).Row + 1
        FL1.Range("A" & NoLig & ":AR" & NoLig).Copy _
    Destination:=Worksheets("FM2CA").Range("A" & DerniereLigneUtilisee)
        Case Is = "2CB"
              DerniereLigneUtilisee = Worksheets("FM2CB").Range("A" & Rows.Count).End(xlUp).Row + 1
        FL1.Range("A" & NoLig & ":AR" & NoLig).Copy _
    Destination:=Worksheets("FM2CB").Range("A" & DerniereLigneUtilisee)
        End Select
    Next
    Set FL1 = Nothing
    tri ("FM1CA")
    tri ("FM1CB")
    tri ("FM1CC")
    tri ("FM1CF")
    tri ("FM2CA")
    tri ("FM2CB")
End Sub
Sub tri(ByVal feuille As String)
ActiveWorkbook.Worksheets(feuille).Sort.SortFields.Clear
    ActiveWorkbook.Worksheets(feuille).Sort.SortFields.Add Key:=Range("A2"), _
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets(feuille).Sort
        .SetRange Range("A2:AR82")
        .Header = xlNo
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    End Sub



a associer à un bouton ou un raccourci clavier

nb changer A3 en A2 dans le tri

nb changer For NoLig = 2 en For NoLig = 3 dans boucleclasse

@+ Le Pivert
0
Un grand MERCI!!! "Le Pivert" pour ton aide et ta réponse.
Ca marche super bien!! Et j'ai fait pareil pour les instruments, c'est top.
Par contre, il y a 4 choses que je ne comprends pas bien :
1) que signifient tes 2 "nb" que tu as mis à la fin de ton précédent message? Dans quel but il faudrait changer les A3 en A2 et NoLig?
2) Actuellement, pour mes instruments, le tri se fait par ordre alphabétique de nom de famille (donc colonne A). Comment faire pour qu'il se fasse par ordre de niveau (c'est à dire avec la colonne J?).
3) Comment faire pour qu'à chaque fois que je lance la macro, il remplace les données d'avant par les nouvelles (actuellement, il les re-créée, et ça fait des doublons).
4) As-tu un lien qui permet d'expliquer comment ajouter un bouton raccourci clavier?
Merci encore et bonne soirée!
0
cs_Le Pivert Messages postés 7904 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 14 août 2024 729
9 sept. 2021 à 18:41
questions

pour la 1 ne pas en tenir compte, j'ai rectifié le code sur ce post

pour la 2 dans la macro tri, changer "A2" par "J2"

pour la 3 mettre ceci:

Sub reinitialiser(ByVal feuille As String)
 Worksheets(feuille).Range("A2:AR82").ClearContents
End Sub


et au début de la macro boucleclasse ceci:

Sub boucleclasse()
Dim FL1 As Worksheet, NoCol As Integer
Dim NoLig As Long, Var As Variant
Dim DerniereLigneUtilisee As Long
    Set FL1 = Worksheets("GLOBAL")
    NoCol = 8 'lecture de la colonne H
    reinitialiser ("FM1CA")
    reinitialiser ("FM1CB")
    reinitialiser ("FM1CC")
    reinitialiser ("FM1CF")
    reinitialiser ("FM2CA")
    reinitialiser ("FM2CB")
    For NoLig = 3 To Split(FL1.UsedRange.Address, "$")(4)
     Var = FL1.Cells(NoLig, NoCol)
'et la suite


et enfin la 4 voir ceci:

https://fr.extendoffice.com/documents/excel/5102-excel-assign-hotkey-to-macro.html


Bon courage

@+ Le Pivert
0
Excellent!
Encore un grand merci!!
0

Bonjour à tous,

Bonjour à tous,
Je me sers super bien du code que vous m'aviez donné l'an passé, c'est super! J'arrive même à faire quelques modifs, c'est top!
Par contre, je suis bloqué sur un point : à la fin de ma feuille "GLOBAL", il y a des lignes que je n'ai pas envie que la macro prenne en compte pour dispatcher les élèves dans les autres feuilles. J'aimerais que la macro fasse son boulot que des lignes 3 à 110, et là, il me prend tout le document. Comment faire?
Je mets en pièce jointe le document, mais sans les noms bien sûr.
Merci d'avance pour votre aide!

0
cs_Le Pivert Messages postés 7904 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 14 août 2024 729
1 sept. 2022 à 09:07

Bonjour,

remplacer

For NoLig = 3 To Split(FL1.UsedRange.Address, "$")(4)

par
 
For NoLig = 3 To 110

@+ Le Pivert 

0