mlyneb
Messages postés2Date d'inscriptionlundi 19 février 2007StatutMembreDernière intervention20 février 2007
-
19 févr. 2007 à 21:00
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 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!
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 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.
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201823 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...
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201823 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