Macro pour copier/insérer des lignes [Résolu/Fermé]

Signaler
Messages postés
5
Date d'inscription
jeudi 18 avril 2013
Statut
Membre
Dernière intervention
22 avril 2013
-
Messages postés
12251
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
17 mars 2021
-
Bonjour tout le monde,

j'essaye d'automatiser dans une macro une démarche assez simple.

J'ai une feuille de calcul avec x lignes et je voudrais que ma macro me prenne chaque ligne , dont la cellule à la colonne 3 est non vide, pour me l'insérer dans la ligne suivante. J'en appelle à votre indulgence, je suis nouveau en programmation sous vba^^.

Alors voilà ma macro :

Sub Duplicate()
Dim r As Integer

Sheets("Feuil1").Select

For r = 17 To ActiveSheet.UsedRange.Rows.Count
If Cells(r, 3) <> "" Then


Rows("r:r").Select
Selection.Copy
Rows("r+1:r+1").Select
Selection.Insert Shift:=xlDown
Application.CutCopyMode = False


End If

Next r


End Sub


Si vous avez une petite idée pour me débloquer, c'est avec grand plaisir que je vous invite à la partager :)

2 réponses

Messages postés
12251
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
17 mars 2021
2 626
Bonjour,

1- r étant une variable, on ne l'entoure pas de guillemets
2- Rows("r:r") n'existe pas, il convient d'utiliser Rows(r)
3- Eviter les .Select et les copy paste.
La syntaxe pour un copié-collé dans une même feuille est :
Range(machin).Copy Range(truc)
Donc :
remplacer :
Rows("r:r").Select  
Selection.Copy  
Rows("r+1:r+1").Select etc...
par :
Rows(r).Copy Rows(r+1)



Cordialement,
Franck P
Messages postés
5
Date d'inscription
jeudi 18 avril 2013
Statut
Membre
Dernière intervention
22 avril 2013

Merci pour ta réponse, j'essaye ça :

Sub Duplicate()
Dim r As Integer
Dim c As Integer


Sheets("Feuil1").Select


For r = 17 To ActiveSheet.UsedRange.Rows.Count


If Cells(r, 3) <> "" Then

Rows(r).Copy Rows(r + 1)
Selection.Insert Shift:=xlDown
Application.CutCopyMode = False


End If


Next r


End Sub

Mais le pb est que quand je la lance, rien ne se passe :/
Messages postés
12251
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
17 mars 2021
2 626
Je n'ai fait que te donner des pistes.
Tu dis :
Si j'ai quelque chose en colonne C, je copies la ligne et l'insères en dessous. Donc la ligne suivante contient quelque chose en colonne C et donc on réinserre.....
C'est pas bon tout ça.
Si tu veux réaliser ce que tu souhaites, il convient de boucler de la dernière à la première ligne.
Essaye quelque chose comme ceci :
Sub Duplicate()
Dim r As Integer
Dim c As Integer

Sheets("Feuil1").Select
For r = ActiveSheet.UsedRange.Rows.Count To 17 Step -1
    If Cells(r, 3) <> "" Then
        Rows(r).Copy
        Rows(r + 1).Insert Shift:=xlDown
    End If
Next r
End Sub

ps : à quoi te sert c As Integer???
Messages postés
5
Date d'inscription
jeudi 18 avril 2013
Statut
Membre
Dernière intervention
22 avril 2013

j'avais fait une double boucle pour essayer de réaliser la manip, puis je l'avais enlever mais j'ai oublié de virer le c as integer (variable de ma deuxieme boucle)
Messages postés
5
Date d'inscription
jeudi 18 avril 2013
Statut
Membre
Dernière intervention
22 avril 2013

bon je l'ai adapté et ça marche niquel !! merci beaucoup pour ta réactivité !
Messages postés
12251
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
17 mars 2021
2 626
de rien.
A+