Aide pour configuration d'un macro sur excel

Bonjour,

J'ai besoin de configurer une grille excel pour mon entreprise. Pour cela, je dois mettre en place un macro pour que (voir le fichier joint) :
- lorsque le statut dans la colonne G de la feuille 1 passe en "Accepté"
- la ligne est copié dans la feuille 2

Bien évidemment il faudrait que les lignes se collent les unes en dessous des autres afin de ne pas effacer les précédentes.

Quelqu'un aurait-il configurer cela ?

Le document est : https://www.cjoint.com/c/KInkaWERch2

Configuration: Windows / Chrome 93.0.4577.63

8 réponses

  1. Contributeur
    Bonjour,

    Pour faire une boucle:

    https://www.developpez.net/forums/d605223/logiciels/microsoft-office/excel/contribuez/boucles-parcourir-colonne-ligne-plage-donnees-2-methodes/

    pour trouver la dernière ligne remplie:

    https://excel-malin.com/tutoriels/vba-tutoriels/vba-trouver-la-derniere-cellule-utilisee/

    pour copier une plage:

    https://docs.microsoft.com/fr-fr/office/vba/api/excel.range.copy

    ce qui donne cette macro, a mettre dans un module et à associer à un bouton ou un raccourci clavier:

    Option Explicit
    'https://www.developpez.net/forums/d605223/logiciels/microsoft-office/excel/contribuez/boucles-parcourir-colonne-ligne-plage-donnees-2-methodes/
    'https://excel-malin.com/tutoriels/vba-tutoriels/vba-trouver-la-derniere-cellule-utilisee/
    'https://docs.microsoft.com/fr-fr/office/vba/api/excel.range.copy
    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("Liste de commande")
        NoCol = 7 'lecture de la colonne G
        For NoLig = 2 To Split(FL1.UsedRange.Address, "$")(4)
            Var = FL1.Cells(NoLig, NoCol)
            If Var = "Accepté" Then
            DerniereLigneUtilisee = Worksheets("Feuil1").Range("A" & Rows.Count).End(xlUp).Row + 1 'où X est la colonne donnée
            FL1.Range("A" & NoLig & ":H" & NoLig).Copy _
        Destination:=Worksheets("Feuil1").Range("A" & DerniereLigneUtilisee)
            End If
        Next
        Set FL1 = Nothing
    End Sub
    


    Voilà
    0
    1. Bonjour,
      Merci pour votre aide, ca marche très bien !
      Par contre, est-il obligé d'associer cette macro à un bouton ? Cela peut-il se faire automatiquement ?
      0
      1. Contributeur
        Oui en déclenchant la macro à l'activation de la feuille1

        Se mettre sur la feuille 1 et faire Alt F11 pour accéder à son module:

        mettre ce code:

        Option Explicit
        Private Sub Worksheet_Activate()
        For_X_to_Next_Ligne
        End Sub
        


        mais il va falloir corriger la macro, car si on n'efface pas les anciennes saisies cela va s'accumuler!

        on efface donc :

        Option Explicit
        'https://www.developpez.net/forums/d605223/logiciels/microsoft-office/excel/contribuez/boucles-parcourir-colonne-ligne-plage-donnees-2-methodes/
        'https://excel-malin.com/tutoriels/vba-tutoriels/vba-trouver-la-derniere-cellule-utilisee/
        'https://docs.microsoft.com/fr-fr/office/vba/api/excel.range.copy
        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("Liste de commande")
            NoCol = 7 'lecture de la colonne G
                   DerniereLigneUtilisee = Worksheets("Feuil1").Range("A" & Rows.Count).End(xlUp).Row + 1 'où X est la colonne donnée
            Range("A2:H" & DerniereLigneUtilisee).ClearContents 'on efface
            For NoLig = 2 To Split(FL1.UsedRange.Address, "$")(4)
                Var = FL1.Cells(NoLig, NoCol)
                If Var = "Accepté" Then
                DerniereLigneUtilisee = Worksheets("Feuil1").Range("A" & Rows.Count).End(xlUp).Row + 1 'où X est la colonne donnée
                FL1.Range("A" & NoLig & ":H" & NoLig).Copy _
            Destination:=Worksheets("Feuil1").Range("A" & DerniereLigneUtilisee)
                End If
            Next
            Set FL1 = Nothing
        End Sub
        


        voilà prêt à l'emploi!

        @+ Le Pivert
        0
      2. @cs_Le PivertBonjour,
        Je viens de voir qu'il y a une erreur sur la macro, en effet quand la fonction "accepté" est renseigné, toutes les lignes de la feuille 1 sont copiés. Or, il faudrait que seulement la ligne concerné soit copié et non celle d'avant (car sinon on les retrouve plusieurs fois dans la feuille 2).

        Que faut-il changer ?
        0
    2. Contributeur
      bonjour,

      Se déclenche quand tu changes une selection dans la colonne G



      0
      1. Bonjour,
        Il y a une erreur sur la macro, en effet quand la fonction "accepté" est renseigné, toutes les lignes de la feuille 1 sont copiés. Or, il faudrait que seulement la ligne concerné soit copié et non celle d'avant (car sinon on les retrouve plusieurs fois dans la feuille 2).

        Que faut-il changer ?
        0
        1. Contributeur
          Bonjour,
          4 jours après mon envoi, je n'ai plus le classeur...

          Donc,
          renvoie ton classeur avec la macro
          et pas dans 4 jours !!!
          0
          1. Contributeur
            Je viens réessayer et ca marche
            KInkaWERch2_liste-cets.xlsm
            0
            1. Merci,
              Le voila : https://www.cjoint.com/c/KItkup2Vm22
              0
              1. Contributeur
                SURTOUT NE REGARDE PAS CE QUE LES BÉNÉVOLES TE PROPOSENT A 9 H 21

                Adieu

                0