Effectifs de classe sur plusieurs feuilles

Résolu
maxime2935 -  
cs_Le Pivert Messages postés 8437 Statut Contributeur -
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

  1. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
     
    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
    1. maxime2935
       
      Bonjour,
      Merci pour ta réponse,
      mais rien ne se passe quand je lance le code... :(
      Bonne journée
      0
      1. cs_Le Pivert Messages postés 8437 Statut Contributeur 730 > maxime2935
         
        Il faut adapter le code à ton environnement: nom des feuilles , colonnes correspondantes et casse
        0
  2. M-12 Messages postés 1349 Statut Membre 285
     
    Bonjour,
    Un exemple à mettre à ta sauce
    https://www.cjoint.com/c/KIikevCCyRK
    0
    1. maxime2935
       
      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
  3. M-12 Messages postés 1349 Statut Membre 285
     
    Peut-être savoir à qui tu réponds?
    et de plus placer un classeur exemple ressemblant à l'original avec données non confidentielles
    0
    1. maxime2935
       
      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
  4. maxime2935
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. maxime2935
     
    Toujours personne pour m'aider..... :(
    0
    1. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
       
      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
  7. maxime2935
     
    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
    1. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
       
      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
  8. maxime2935
     
    Excellent!
    Encore un grand merci!!
    0
  9. maxime2935
     

    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
    1. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
       

      Bonjour,

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

      @+ Le Pivert 

      0