Boucle For

Fermé
123Mart123 - 5 avril 2017 à 22:01
 123Mart123 - 8 mai 2017 à 22:05
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 !!

A voir également:

7 réponses

gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 709
5 avril 2017 à 22:20
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
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
gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 709
5 avril 2017 à 22:54
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
Oui, c'est exactement ça !

Merci beaucoup pour votre temps !!
0
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

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

Posez votre question
gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 709
6 avril 2017 à 18:15
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
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
gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 709
7 avril 2017 à 18:15
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
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
gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 709
13 avril 2017 à 18:45
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
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
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
gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 709
8 mai 2017 à 21:25
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
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