Dupliquez ligne excel selon une valeur

Résolu
SELKAIM -  
 depassage -
Bonjour,

Tout d'abord je n'ai aucune formation VBA, je suis à mes débuts et ce n'est pas mon cœur de métier mais j'ai besoin de réussir une macro afin de gagner du temps au boulot.

J'ai un fichier excel, construit de la sorte :

A B C D
1 MAX 16 ADRESSE 2


J'aimerais que cette ligne (A1;D1) soit dupliqué 1 fois (D-1) (Si D=5, alors dupliqué 4 fois^^)
J'aurais quotidiennement environ 50 lignes, et 10% d'entres elles auront un nombre ">2" en colonne "D", donc pas mal de duplication de ligne.

J'ai trouvé pas mal de code faisant cela, mais impossible d'en faire fonctionner un.
J'ai trouvé celui-ci, j'ai essayé de l'adapter mais ca ne marche pas.

Voici mon code :

AA est égale à D (dans mon exemple soit le nbr de ligne souhaité)
Z correspond à une colonne vierge permettant de stocker le "D-1"
A correspond à la colonne "NOM" afin de ne pas dupliquer 2 fois une ligne déjà dupliqué
3 correspond au numéro de ma première ligne de données.

Sub duplique()
Application.ScreenUpdating = False
der = Range("A65536").End(xlUp).Row + 1
For n = 3 To Range("A65536").End(xlUp).Row
    For i = 3 To der
        If Range("Z" & i) > 1 Then
        eti = Range("A" & i).Value
        nbr = Range("Z" & i).Value
        Range("AA" & i) = 1
            For j = i + 1 To i + nbr - 1
                If Range("A" & j).Value = eti Then
                Range("AA" & j) = Range("AA" & j - 1) + 1
                Range("Z" & j) = nbr
                Else
                Rows(j).Insert shift:=xlDown, CopyOrigin:=xlFormatFromRightOrBelow
                Range("A" & j) = eti
                Range("AA" & j) = Range("AA" & j - 1) + 1
                Range("Z" & j) = Range("Z" & i).Value
                der = der + 1
                End If
            Next j
        i = j - 1
        End If
    Next i
Next n
End Sub


Merci de votre aide, à votre écoute,

Simon
A voir également:

8 réponses

depassage
 
Bonjour,

Pour obtenir ton désir essaies ceci :

Sub duplique()
Dim lig As Long, dup As Integer
For lig = Cells(Rows.Count, "A").End(xlUp).Row To 1 Step -1
dup = Cells(lig, "D").Value
If dup > 1 Then
Rows(lig + 1).Resize(dup - 1).Insert
Rows(lig).Resize(dup).FillDown
End If
Next lig
End Sub
1
SELKAIM Messages postés 6 Date d'inscription   Statut Membre Dernière intervention  
 
Bonjour,

Merci pour votre aide, je viens d'essayer, ca fonctionne parfaitement...
Bravo pour ce code très court, mais super efficace.

Bonne continuation,

Amicalement

Simon
0
SELKAIM Messages postés 6 Date d'inscription   Statut Membre Dernière intervention  
 
Bonjour,

Je relance ce sujet, car j'ai une nouvelle problématique.
Je souhaiterais incrémenter un colonne suite à la duplication.
Je reprend le fichier excel, construit de la sorte :

A B C D
1 MAX 16 ADRESSE 2

Suite à la duplication, cela donne donc :

A B C D
1 MAX 16 ADRESSE 2
1 MAX 16 ADRESSE 2

Je souhaiterais que la colonne C soit incrémenter de la manière suivante :
16A, 16B etc.. (selon nbr de duplication et doublons de valeur (ici "16")

Merci à vous,

Simon
0
depassage
 
Bonjour,

Pour compléter ta fonction, voilà le complément de code selon ton exemple :
Sub duplique()
Dim lig As Long, dup As Integer, dec As Integer, pos As Integer, cel
For lig = Cells(Rows.Count, "A").End(xlUp).Row To 1 Step -1
dup = Cells(lig, "D").Value
If dup > 1 Then
Rows(lig + 1).Resize(dup - 1).Insert
Rows(lig).Resize(dup).FillDown
cel = Cells(lig, "C").Value
pos = InStr(cel, " ")
For dec = 1 To dup - 1
Cells(lig + dec, "C").Value = Left(cel, pos - 1) & Chr(64 + dec) & Mid(cel, pos)
Next dec
End If
Next lig
End Sub
0
SELKAIM Messages postés 6 Date d'inscription   Statut Membre Dernière intervention  
 
Bonjour,

Merci de votre réponse rapide..

Ca bloque, grace à "Option explicit", il m'identifie la ligne "11" en jaune soit
"Cells(lig + dec, "I").Value = Left(cel, pos - 1) & Chr(64 + dec) & Mid(cel, pos)"
Il m'indique "Erreur d'exécution 5" : "Argument ou appel de procédure incorrect"

Dans mon fichier, c'est "I" la colonne "C" dans mon exemple. Elle correspond à un nombre (entre 1 & 6 chiffres).

A votre disposition pour plus d'infos..

Merci encore énormément
Simon
0
depassage
 
Bonjour,

Tu as mal recopié le code car il manque des espaces dans le code en jaune.
Si tu changes les données il faut aussi tout adapter correctement et j'avais mis la lettre colonne dans ce but..
0
SELKAIM Messages postés 6 Date d'inscription   Statut Membre Dernière intervention  
 
Bonjour,

Désolé, j'ai essayé de comprendre et surtout, de m'approprier ce code.
Je ne vois pas les espaces manquants dans le code jaune.

Merci pour votre aide, je vais continuer de chercher.

Simon
0

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

Posez votre question
SELKAIM Messages postés 6 Date d'inscription   Statut Membre Dernière intervention  
 
Sub duplique()
Dim lig As Long, dup As Integer, dec As Integer, pos As Integer, cel
For lig = Cells(Rows.Count, "B").End(xlUp).Row To 1 Step -1
dup = Cells(lig, "A").Value
If dup > 1 Then
Rows(lig + 1).Resize(dup - 1).Insert
Rows(lig).Resize(dup).FillDown
cel = Cells(lig, "I").Value
pos = InStr(cel, " ")
For dec = 1 To dup - 1
Cells(lig + dec, "I").Value = Left(cel, pos - 1) & Chr(64 + dec) & Mid(cel, pos)
Next dec
End If
Next lig
End Sub


Voilà mon code actuel :
La colonne A est celle de du nbr de lignes à insérer.
La colonne B est celle des noms des n° de dossier pour identifier les doublons
La colonne I correspond au numéro du colis à incrémenter par A,B, C etc..


Merci à vous,
0
depassage
 
Bonjour,

ce code fonctionne correctement à un détail près, c'est que tu devrais avoir :
For lig = Cells(Rows.Count, "A").End(xlUp).Row To 1 Step -1
0
SELKAIM Messages postés 6 Date d'inscription   Statut Membre Dernière intervention  
 
Bonjour,

Merci pour votre suivi,
Ca ne marche pas, lorsque je met "A", il m'indique toujours une erreur ici :

 Cells(lig + dec, "I").Value = Left(cel, pos - 1) & Chr(64 + dec) & Mid(cel, pos)


Je n'arrive vraiment pas à comprendre l'erreur

Simon
0
depassage
 
Bonsoir,

"il m'indique toujours une erreur ici "

Quelle erreur ?
0