jeudi 16 juin 2011

Dupliquer des lignes d’un fichier Excel

Imaginons un fichier excel composé de lignes du type :

Col1 Col2 Col3 Col10
Maison Adresse 1 Adresse 2 Chambre, Salon, Cuisine
Appart Adresse 3 Adresse 4  
Bateau Adresse 5 Adresse 6 Salle des machines, Plage

Cet exemple est complètement inutile, mais c’est le principe qui compte : imaginons que nous souhaitons construire des requêtes d’insertion en base, qui permettent d’insérer dans notre exemple, 6 lignes :

Maison Adresse 1 Adresse 2 Chambre
Maison Adresse 1 Adresse 2 Salon
Maison Adresse 1 Adresse 2 Cuisine
Appart Adresse 3 Adresse 4  
Bateau Adresse 5 Adresse 6 Salle des machines
Bateau Adresse 5 Adresse 6 Plage

Voici la macro magique qui va permettre de générer le tableau 2 à partir du tableau 1. Attention, on suppose que les lignes à dupliquer sont celles qui contiennent en colonne 10, des valeurs séparées par des virgules.

Sub gogoJonyGo()
Dim iligne As Integer
iligne = 2
 
 
While Cells(iligne, 1).Value <> "" And iligne < 1000
    
    If InStr(1, Cells(iligne, 10).Value, ",") > 0 Then
    
        ichar = InStr(1, Cells(iligne, 10).Value, ",")
        sgauche = Trim(Left(Cells(iligne, 10).Value, ichar - 1))
        sdroite = Trim(Right(Cells(iligne, 10).Value, Len(Cells(iligne, 10).Value) - ichar))
        Rows(iligne + 1).Select
        Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
        Rows(iligne).Select
        Selection.Copy
        Rows(iligne + 1).Select
        ActiveSheet.Paste
        Application.CutCopyMode = False
        Cells(iligne, 10) = sgauche
        Cells(iligne + 1, 10) = sdroite
    
    End If
    
    iligne = iligne + 1
Wend
   
End Sub

4 commentaires:

  1. C'est exactement le type de macro dont j'ai besoin, malheureusement je l'ai testé et ça ne marche pas.

    RépondreSupprimer
    Réponses
    1. Bonjour,

      je viens de l'utiliser à nouveau et cette macro fonctionne parfaitement. Il faut très probablement l'adapter à votre propre fichier.

      La boucle While Cells(iligne, 1).Value <> "" And iligne < 1000
      indique que la macro va parcourir toutes les lignes à partir de la 2ème (iligne=2 au dessus), tant que la première colonne n'est pas vide et que l'on est à moins de 1000 lignes.

      Le If InStr(1, Cells(iligne, 10).Value, ",") > 0 Then
      indique que les opérations vont être effectuées uniquement si on trouve une virgule dans la colonne 10.

      Donc s'il y a des endroits à adapter, ce sont ces deux lignes, ainsi que toutes les lignes contenant "10" pour changer la colonne concernée par la duplication.

      Cordialement

      Supprimer
  2. Bonjour et si on une autre colonnes comme le colonne 10 et on vas faire le meme choses

    RépondreSupprimer
  3. Bonjour, si je bien compris la sens de votre question, il suffit de remplacer "10" par le numéro de la colonne concernée.

    RépondreSupprimer