Dupliquer et inserer une ligne automatiquement d'apres la valeur d'une cellule

AlCapone

XLDnaute Nouveau
Bonjour à tous,

Je suis entrain d'automatiser des mises en forme de feuilles excel, pour importer dans un logiciel comptable, et je viens de découvrir la puissance du VBA, mais hélas sans rien y comprendre.

D'après mes recherches sur le forum, il est possible de dupliquer et insérer une ligne automatiquement selon la valeur d'une cellule. Mais je n'ai pas trouvé mon bonheur.

Mon problème : j'ai x colonnes et x lignes. Je souhaiterai dupliquer (en valeur) et insérer une ligne juste en dessous, dès que la cellule d'une colonne contient un critère "z".
Ensuite, sur cette ligne dupliquée (en valeur) et insérée, je souhaiterai remplacer la lettre de la première cellule par une autre (disons, "G" par "A"). Est il possible de faire cela ?
Je vous mets un fichier d'exemple pour plus de compréhension.

Vous remerciant pour votre aide et surtout pour votre partage.
 

Pièces jointes

  • Testdupliquer.xlsm
    45.8 KB · Affichages: 52

Paf

XLDnaute Barbatruc
Re : Dupliquer et inserer une ligne automatiquement d'apres la valeur d'une cellule

bonjour et bienvenu sur XLD

D'après mes recherches sur le forum, il est possible de dupliquer et insérer une ligne automatiquement selon la valeur d'une cellule. Mais je n'ai pas trouvé mon bonheur.

les demandes et les codes ne manquent pas, mais, c'est sûr, il faut les adapter ...

une macro qui, a priori, réalise la demande
Code:
Sub DupliqueLigne()
 Dim i As Long, j As Byte, Flag As Boolean, TabCible

 TabCible = Array("HC30MB", "13OTHTAX") 'liste des codes pour lesquels on duplique la ligne; possible d'en rajouter
 With Worksheets("IMPORT")
 For i = .Range("A" & .Rows.Count).End(xlUp).Row To 2 Step -1
    Flag = False
    For j = LBound(TabCible) To UBound(TabCible)
        If Cells(i, 10) = TabCible(j) Then
            Flag = True
            Exit For
        End If
    Next j
    If Flag Then ' si correspondance
        Rows(i).Copy
        Rows(i).Insert Shift:=xlDown
        Cells(i + 1, 1) = "A3"
    End If
 Application.CutCopyMode = False
 Next i
 End With
End Sub

Attention, les cellule contenant #NA en fin de colonne J, font planter la macro.

A supprimer manuellement, ou par macro.

A+
 

AlCapone

XLDnaute Nouveau
Re : Dupliquer et inserer une ligne automatiquement d'apres la valeur d'une cellule

Bonsoir PAF,

Je viens de mettre à profit ton module, il est démentiel et te remercie pour ta réactivité.

Mais il y a un tout petit "hic", c'est qu'à l'origine, toutes les lignes et cellules contiennent des formules. C'est pour cela que j'aurai aimé dupliquer la ligne qu'en valeur (si cela est possible). Je suis désolé, il est vrai que sur mon fichier test, j'avais fait un copie/coller valeur.

En revanche, sur le fichier original, si je fais un copie/coller valeur, la macro fonctionne nickel.

Merci

AlCapone
 

Paf

XLDnaute Barbatruc
Re : Dupliquer et inserer une ligne automatiquement d'apres la valeur d'une cellule

Re,

à tester, un code beaucoup plus rapide si les lignes sont nombreuses
Code:
Sub DupliqueLigne()
 Dim MonTAb, TabCible, TabFinal(), i As Long, j As Long, Flag As Boolean, x As Long
 
 TabCible = Array("HC30MB", "13OTHTAX") 'liste des codes pour lesquels on duplique la ligne

 With Worksheets("IMPORT")

 MonTAb = .Range("A2:O" & .Range("A" & .Rows.Count).End(xlUp).Row)
 For i = LBound(MonTAb) To UBound(MonTAb)
    Flag = False
    x = x + 1
    ReDim Preserve TabFinal(1 To UBound(MonTAb, 2), 1 To x)
    For j = LBound(MonTAb, 2) To UBound(MonTAb, 2)
        TabFinal(j, x) = MonTAb(i, j)
    Next j
    
    For j = LBound(TabCible) To UBound(TabCible)
        If MonTAb(i, 10) = TabCible(j) Then
            Flag = True
            Exit For
        End If
    Next j
    If Flag Then ' si correspondance
        x = x + 1
        ReDim Preserve TabFinal(1 To UBound(MonTAb, 2), 1 To x)
        For j = LBound(MonTAb, 2) + 1 To UBound(MonTAb, 2)
            TabFinal(j, x) = MonTAb(i, j)
        Next j
        TabFinal(1, x) = "A3"
    End If
 Next i
 .Range("A2:O" & .Range("A" & .Rows.Count).End(xlUp).Row).ClearContents
 .Range("A2").Resize(UBound(TabFinal, 2), UBound(TabFinal, 1)) = Application.Transpose(TabFinal)
 End With
End Sub

à l'issue du traitement, toutes les lignes seront "en valeur".

A+
 

Discussions similaires

Statistiques des forums

Discussions
312 321
Messages
2 087 246
Membres
103 498
dernier inscrit
FAHDE