Copier et coller des lignes sur la prochaine ligne vide

Justine56

XLDnaute Nouveau
Bonjour à tous,

Je suis en train de mettre en place une macro me permettant de copier/coller des lignes d'un tableau d'une feuille sur une autre feuille dans le même classeur.
La macro fonctionne mais je voudrais savoir ce que je devais rajouter pour qu'il me copie les informations sur la prochaine ligne vide et non sur ce qu'il y a de déjà existants.

Voici ma macro :
Sub Bouton20_Cliquer()
j = 10
For i = 10 To 65536
If Sheets("UT 1").Range("Q" & i).Value = "NON" Then
Application.Sheets("Plan d'action").Range("B" & j & ":C" & j & ":E" & j).Value = Application.Sheets("UT 1").Range("A" & i & ":D" & i & ":R" & i).Value
j = j + 1
End If
Next i
MsgBox "Vous avez copié " & j - 10 & " lignes.", , "Traitement terminé"
End Sub

je vous remercie d'avance de votre aide,
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Justine,
Il vous faut initialiser j de façon dynamique, comme avec ceci à tester :
VB:
j = Sheets("UT 1").Range("B" & Rows.Count).End(xlUp).Row
UT 1 est la feuille à choisir où ranger les infos
Prendre la colonne où sont déjà rangées des infos ( ici colonne B )
 

Justine56

XLDnaute Nouveau
Bonjour,

Je viens de faire le test et ça ne me copie plus du tout les lignes :(
UT1 est la feuille où les infos sont copiés pour être collés dans la feuille "Plan d'action". Peut-être ai-je fais une autre erreur dans mon code ?

Merci d'avoir pris le temps de me répondre.
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Oups ! J'ai compris le contraire.
VB:
j = 1+Sheets("Plan d'action ").Range("B" & Rows.Count).End(xlUp).Row
Cette ligne recherche dans la feuille Plan d'action quelle est la première cellule vide de la colonne B.
( sans le 1+ on trouve la dernière ligne occupée.
Attention votre msgbox devient faux puisque j est dynamique.
Si pb, faites un petit fichier test. Ce sera plus simple.
 

Justine56

XLDnaute Nouveau
Je me suis mal exprimée aussi :)

Alors j'ai bien intégré la ligne et je confirme ça a un impact sur la fin de mon code, il n'arrive plus à répondre à ma condition du départ qui est de copier/coller les lignes comprenant le terme "NON" dans la colonne Q. Si vous avez une idée de ce que je devrais modifier je suis preneuse.
En tout cas, le retour à la ligne fonctionne et je vous en remercie !!!
 

Justine56

XLDnaute Nouveau
Oui bien sûr :)
Je suis repartie de zéro en enregistrant la macro que je souhaitais obtenir et non en la codant manuellement.
Et j'ai rajouté la phrase que vous m'avez donné.
Voici le code que j'obtiens :

Sub Export_lignes_UT1_plan_actions()
'
' Export_lignes_UT1_plan_actions Macro
'Critère à filtrer
ActiveSheet.Range("$A$8:$R$33").AutoFilter Field:=17, Criteria1:="NON"
'Sélection de la colonne B obtenues après le filtre
Range("B20:B32" & Range("R65563").End(xlUp).Row).Select
Selection.Copy
Sheets("Plan d'action").Select
'Copiés/Collés des lignes dans la première ligne disponible de la colonne C
Range("C1048576").End(xlUp).Offset(1, 0).Select
ActiveSheet.Paste
Sheets("UT 1").Select
'Sélection de la colonne D obtenues après le filtre
Range("D20:D32" & Range("R65563").End(xlUp).Row).Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Plan d'action").Select
'Copiés/Collés des lignes dans la première ligne disponible de la colonne B
Range("B1048576").End(xlUp).Offset(1, 0).Select
ActiveSheet.Paste
Sheets("UT 1").Select
'Sélection de la colonne R obtenues après le filtre
Range("R20:R32" & Range("R65563").End(xlUp).Row).Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Plan d'action").Select
'Copiés/Collés des lignes dans la première ligne disponible de la colonne B
Range("E1048576").End(xlUp).Offset(1, 0).Select
ActiveSheet.Paste
Sheets("UT 1").Select
Range("Q8:Q9").Select
'Retire le filtre appliqué sur la feuille UT 1
ActiveSheet.Range("$A$8:$R$33").AutoFilter Field:=17
ActiveWindow.SmallScroll Down:=-9
Range("A8:A9").Select
MsgBox "Ajout au plan d'action effectué"
End Sub

Ce qui ressort en gras ce sont les modifications que j'ai effectué pour qu'ils choisissent toujours l'ensemble des lignes correspond au critère que j'ai cité au début (Présence du texte "NON" dans la colonne Q de la feuille "UT 1") et qu'ils me les collent dans la feuille "Plan d'action" en allant chercher la dernière ligne disponible afin de constituer une base de donnée.

La seule chose que je n'ai pas réussi à finir, c'est le MsgBox m'indiquant le bon nombre de lignes copiés dans la feuille "Plan d'action" :(
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Pour le nombre de lignes copiées, vous pouvez faire au début :
VB:
NbColB1 = Application.WorksheetFunction.CountA(Sheets("Plan d'action").Range("B:B"))
qui compte le nombre de cellules non vides de la colonne B. Puis à la fin la même chose :
Code:
NbColB2 = Application.WorksheetFunction.CountA(Sheets("Plan d'action").Range("B:B"))
NbLignesAjoutées = NbColB2 - NbColB1
NbLignesAjoutées donne la différence de cellules non vides de la fin par rapport au début.
 

Justine56

XLDnaute Nouveau
Dix milles merci ça fonctionne très très bien !!!! :D

Voici le code final obtenu :

Sub Export_lignes_UT1_plan_actions()
'
' Export_lignes_UT1_plan_actions Macro
'Critère à filtrer
ActiveSheet.Range("$A$8:$R$33").AutoFilter Field:=17, Criteria1:="NON"
NbColB1 = Application.WorksheetFunction.CountA(Sheets("Plan d'action").Range("B:B"))
'Sélection de la colonne B obtenues après le filtre
Range("B20:B32" & Range("R65563").End(xlUp).Row).Select
Selection.Copy
Sheets("Plan d'action").Select
'Copiés/Collés des lignes dans la première ligne disponible de la colonne C
Range("C1048576").End(xlUp).Offset(1, 0).Select
ActiveSheet.Paste
Sheets("UT 1").Select
'Sélection de la colonne D obtenues après le filtre
Range("D20:D32" & Range("R65563").End(xlUp).Row).Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Plan d'action").Select
'Copiés/Collés des lignes dans la première ligne disponible de la colonne B
Range("B1048576").End(xlUp).Offset(1, 0).Select
ActiveSheet.Paste
Sheets("UT 1").Select
'Sélection de la colonne R obtenues après le filtre
Range("R20:R32" & Range("R65563").End(xlUp).Row).Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Plan d'action").Select
'Copiés/Collés des lignes dans la première ligne disponible de la colonne B
Range("E1048576").End(xlUp).Offset(1, 0).Select
ActiveSheet.Paste
Sheets("UT 1").Select
Range("Q8:Q9").Select
'Retire le filtre appliqué sur la feuille UT 1
ActiveSheet.Range("$A$8:$R$33").AutoFilter Field:=17
ActiveWindow.SmallScroll Down:=-9
Range("A8:A9").Select
NbColB2 = Application.WorksheetFunction.CountA(Sheets("Plan d'action").Range("B:B"))
NbLignesAjoutées = NbColB2 - NbColB1
MsgBox "Ajout de " & NbLignesAjoutées & " ligne(s) au plan d'action"

End Sub

Ce qui ressort en gras, ce sont le rajout des lignes de codes que vous m'avez donné précédemment et j'ai modifié le MsgBox.

Encore merci et bonne journée :D
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
C'est toujours satisfaisant de parvenir à ses fins.:)

( la prochaine fois utilisez les balises pour le code, c'est plus lisible : </> )
VB:
Sub Export_lignes_UT1_plan_actions()
'
' Export_lignes_UT1_plan_actions Macro
'Critère à filtrer
ActiveSheet.Range("$A$8:$R$33").AutoFilter Field:=17, Criteria1:="NON"
NbColB1 = Application.WorksheetFunction.CountA(Sheets("Plan d'action").Range("B:B"))
'Sélection de la colonne B obtenues après le filtre
Range("B20:B32" & Range("R65563").End(xlUp).Row).Select
 

Discussions similaires

Réponses
0
Affichages
83

Statistiques des forums

Discussions
311 720
Messages
2 081 899
Membres
101 834
dernier inscrit
Jeremy06510