Macro pour copier/insérer des lignes

Résolu
lienlien34 Messages postés 5 Date d'inscription   Statut Membre Dernière intervention   -  
pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   -
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

  1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    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
    0
  2. lienlien34 Messages postés 5 Date d'inscription   Statut Membre Dernière intervention  
     
    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 :/
    0
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      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???
      0
    2. lienlien34 Messages postés 5 Date d'inscription   Statut Membre Dernière intervention  
       
      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)
      0
    3. lienlien34 Messages postés 5 Date d'inscription   Statut Membre Dernière intervention  
       
      bon je l'ai adapté et ça marche niquel !! merci beaucoup pour ta réactivité !
      0
    4. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      de rien.
      A+
      0