Insertion automatique de lignes dans Excel

mlyneb Messages postés 2 Date d'inscription lundi 19 février 2007 Statut Membre Dernière intervention 20 février 2007 - 19 févr. 2007 à 21:00
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 - 20 févr. 2007 à 23:37
Bonjour!
Je suis plutôt nulle dans la programmation en Visual Basic, mais j'aurais besoin d'aide pour effectuer une opération l'utilisant dans Excel.
Possédant un fichier possédant deux colonnes ("A" et "B"), il faudrait que je puisse insérer après chaque ligne un nombre de lignes vide correspondant à la valeur de la colonne B, tout en recopiant dans ces colonnes créées les valeurs de la ligne originale. Je m'explique par un exemple:

Fichier excel original:

A                            B
item1                      5
item2                      3

Fichier excel à obtenir:

A                     B
item1               5
item1               5
item1               5
item1               5
item1               5
item2               3
item2               3
item2               3

Ce n'est qu'un exemple, mais vous voyez un peu le genre!
Ce serait pour traiter des fichiers plutôt volumineux, alors c'est impensable de faire l'insertion manuelle de colonnes.
Si quelqu'un peut me donner la marche a suivre, ca serait très apprécié!
Merci!

4 réponses

jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
19 févr. 2007 à 21:21
Juste 2 conseils :

1) ouvre ton enregistreur de macro, va à une ligne et fait une insertion de quekques lignes (3, par exemple)
2) ferme l'enregistreur
3) edite la macri générée et vois la syntaxe qu'elle a (tu verras ainsi quelle est celle pour l'insertion de lignes)

Forte de tout celà :

il te faudra insérer des lignes dans une boucle For .... to...

Il est clair que si tu commences par la 1ère ligne, VBA ne s'y retrouvera plus
Si par contre tu commence par la dernière en remontant vers le haut, la chose sera bioen plus facile à gérer puisque chaque ligne non encore traitée aura gardé son rang.

Essaye...
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
19 févr. 2007 à 23:38
Comme te suggères jmf, lorsqu'on supprime ou ajoute des lignes, c'est toujours préférable de commencer par la fin.

Comme tu dis que ton fichier est volumineux, tu dois d'abord vérifier s'il n'y aura pas débordement. Donc, la somme de ta colonne B ne devrait pas dépasser 65536 (moins les lignes d'entêtes)

Donc, le principe:
Tu lis la dernière ligne en remontant jusqu'à la première à vérifier
    (For ligne = dernière to première step -1)
Tu insères une ligne après celle-ci, le nombre de fois nécessaire
    (insert)
Tu copies la ligne lue dans la ligne créée
    (Copy, PasteSpecial)

Essaie et reviens-nous avec ton bout de code si ça coince...

MPi
0
mlyneb Messages postés 2 Date d'inscription lundi 19 février 2007 Statut Membre Dernière intervention 20 février 2007
20 févr. 2007 à 15:25
Merci beaucoup à vous deux, j'ai réussi a créer une macro fonctionnelle pour résoudre mon problème grâce à vos conseils!
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
20 févr. 2007 à 23:37
Super,
je ne voulais pas mettre ma solution avant que tu n'essaies toi-même, mais bon, j'en avais fait une de mon côté et je la mets pour que tu puisses voir la différence avec la tienne. Peut-être que la tienne est plus efficace (?)

Sub Insérer()
    Dim I As Long, J As Integer, Nombre As Integer
   
    'se positionner sur la dernière cellule et remonter
    For I = Range("A65536").End(xlUp).Row To 2 Step -1  ' changer 2 au besoin
       
        'quantité de lignes à insérer...
        Nombre = Range("B" & I)
       
        'insertion et copie de ce nombre de lignes
        For J = 1 To Nombre - 1         '...moins une déjà écrite... (?)
            Rows(I + J).Insert xlDown   'insertion d'une ligne
            Rows(I).Copy                     'copie de la ligne existante
            Rows(I + J).PasteSpecial    'collage des valeurs
        Next
       
    Next
   
    'Enlever la surbrillance de copie
    Range("A1").Select
    Application.CutCopyMode = False
End Sub

MPi
0
Rejoignez-nous