Boucle For

Bonjour,

J'essaie de faire une boucle for pour copier et coller une ligne variable d'un onglet dans la dernière ligne d'un autre onglet.

Les données de ligne1 et ligne2 sont entrées dans une userform par l'utilisateur et je désire que la la boucle for copie les lignes comprises entre ligne1 et ligne2 pour les cellules dans la plage A3:A59 qui contienne BP- & ligne2-ligne1

Par exemple, si ligne1 = 1 et ligne2 = 3 alors la boucle copie les lignes dont il y a BP-1, BP-2 et BP-3 d'inscrit dans la colonne A.


Dim ligne1 As Long
Dim ligne2 As Long
Dim plage As Range
Set ShtL = ThisWorkbook.Sheets("Logbook")
DLigL = ShtL.Range("B65536").End(xlUp).Row
Set plage = ThisWorkbook.Sheets("Suivi").Range("A3:A59")

For i = ligne1 To ligne2
If plage.Value = "BP1-" & i Then
ThisWorkbook.Sheets("Suivi").Range("A1" & i + 2).Row = ShtL.Range("A" & DLigL + 1).Value
End If
Next i


J'espere que ce n'est pas trop confus.

Merci beaucoup de votre aide !!

7 réponses

  1. Contributeur
    Bonjour,

    Il y a quelques problèmes :
    - tout d'abord la valeur de ligne1 et ligne2
    leur valeur est dans ton userform ?

    - tu ne peux pas tester ta plage mais seulement les cellules qui la composent
    0
    1. Oui la valeur de ligne1 et ligne2 est récupérée au début de mon code

      ligne1 = Retval3.BF1FROM.Value
      ligne2 = Retval3.BF1TO.Value


      Pour tester les cellules, je ne sais pas comment m'y prendre...
      0
      1. Contributeur
        Bonjour,

        Je te propose ceci à tester :
        Dim ligne1 As Long
        Dim ligne2 As Long
        Dim DLigL As Long
        Dim cel As Range
        Dim ShtL As Worksheet
        ligne1 = Retval3.BF1FROM.Value
        ligne2 = Retval3.BF1TO.Value
        Set ShtL = ThisWorkbook.Sheets("Logbook")
        DLigL = ShtL.Range("B" & Rows.Count).End(xlUp).Row
        For Each cel In ThisWorkbook.Sheets("Suivi").Range("A3:A59").Cells
        If cel.Value = "BP1-" & ligne1 Or cel.Value = "BP1-" & ligne2 Then
            DLigL = DLigL + 1
            Rows(cel.Row).Copy ShtL.Rows(DLigL)
        End If
        Next cel
        
        0
        1. Oui, c'est exactement ça !

          Merci beaucoup pour votre temps !!
          0
          1. Après plusieurs tests, je me suis rendu compte que ça fonctionne seulement pour les cellules contenant BP1-ligne1 et BP1-ligne2.

            J'aimerais en fait que la macro copie toutes les lignes entre BP1-ligne1 et BP1-ligne2...

            Par exemple si ligne1 = 13 et ligne2 = 16 alors la macro copierait les lignes où les cellules en A contiennent BP1-13, BP1-14, BP1-15 et BP1-16.

            Merci de votre aide encore une fois !!!
            0
        2. Contributeur
          Bonjour,

          ça fonctionne seulement pour les cellules contenant BP1-ligne1 et BP1-ligne2
          Tout à fait exact, je n'avais pas vu la subtilité.
          Tu changes ainsi cette ligne :
          If cel.Value >= "BP1-" & ligne1 And cel.Value <= "BP1-" & ligne2 Then
          0
          1. Merci !
            Désolé de réouvrir ce sujet, mais puisque mon code est déjà présent il sera plus facile de continuer.

            Est-ce possible aussi d'effacer le contenu des lignes qui ont été copiées sauf pour la plage "A3:A59" dans

            ThisWorkbook.Sheets("Suivi").Range("A3:A59").Cells

            Par exemple, une fois que les lignes sont copiées dans l'onglet LogBook, la macro clearcontents les lignes copiées sauf la premiere cellule de chaque ligne.

            Merci beaucoup !!!!!!
            0
          2. Contributeur
            Bonjour,

            Tu rajoutes cette ligne de code
                Rows(cel.Row).Copy ShtL.Rows(DLigL)
                Cells(cel.Row, 2).Resize(1, Cells(cel.Row, Columns.Count).End(xlToLeft).Column).ClearContents
            End If
            
            0
          3. Merci beaucoup !

            J'ai un petit problème par contre...

            Si ligne1=13 et ligne2=20, il supprime toutes les lignes entre 13 et 20, mais aussi la ligne où la cellule en A contient BP1-2.
            0
        3. Contributeur
          Bonjour,

          En global BP1-2 est bien compris entre BP1-13 et BP1-20 :-)
          Il faut comparer en découpage :
          For Each cel In ThisWorkbook.Sheets("Suivi").Range("A3:A59").Cells
              If Left(cel.Value, 4) = "BP1-" And (Mid(cel.Value, 5) >= ligne1 And Mid(cel.Value, 5) <= ligne2) Then
                  DLigL = DLigL + 1
                  Rows(cel.Row).Copy ShtL.Rows(DLigL)
                  Cells(cel.Row, 2).Resize(1, Cells(cel.Row, Columns.Count).End(xlToLeft).Column).ClearContents
              End If
          Next cel
          

          Cela devrait résoudre ton cas et les autres je pense.
          0
          1. Bonjour,

            Merci de votre aide ! Mon projet avance très bien!

            J'ai encore un petit problème,

            J'aimerais dans un autre fonction que si par exemple ligne1 = 13 et ligne2 = 20, la macro copie les lignes BP1-13 à BP1-20 et colle sur BP1-13 +1 (donc BP1-14 à 21), efface le contenu de la première ligne (BP1-13) sauf la première colonne...

            J'ai modifié ce code puisqu'il ne fonctionnait pas :
            Cells(cel.Row, 2).Resize(1, Cells(cel.Row, Columns.Count).End(xlToLeft).Column).ClearContents

            remplacé par
                ShtS.Rows(cel.Row).ClearContents
            ShtS.Range("Q301:Q598").Copy ShtS.Range("A3:A300")

            Où Q301:Q598 contient les mêmes valeurs que A3:A300...

            Merci encore une fois pour votre précieux temps !!
            0
        4. Bonjour,

          Merci de votre temps, est-ce que vous auriez un petit moment pour voir ce problème svp ? Je n'arrive pas à la solution...

          Merci à l'avance.
          0
          1. Contributeur
            Bonjour,

            Je n'arrive pas à la solution...
            Comme mon code ne fonctionnait pas soi-disant je ne vois pas comment je pourrais modifier ton code ésotérique car si Q301:Q598 contient les mêmes valeurs que A3:A300... pourquoi faire une copie ?
            0
          2. Je faisais une copie pour palier au fait que je n'arrivais pas à effacer seulement les valeurs de la colonne B à dernière colonne. J'ai donc fait un code qui effaçait toutes les valeurs et j'ai fait une copie de ces données de Q301:Q598 pour les remettre en A3:A300... Je n'ai pas réussi a faire fonctionner le code que vous m'aviez donner...
            0