Eclater une cellule sur plusieurs lignes
Bonjour
J ai un fichier extrait d une base de donnees (feuille 'Brut')
Seulement dans la colonne I (i) figure plusieurs types de dommages et j aimerai que chaque type soit sur une ligne et non pas tous les uns a cote des autres et que toutes les autres informations soient reprises
J ai mis un exemple en feuille 'exemple'
Ce fichier n ai qu une extraction dans la colonne I il peut il y avoir jusqu a plus de 10 types de dommages et le fichier comporte plus de 5000 lignes (donc le faire manuellement me prend bcp bcp bcp de temps)
Merci pour votre aide
Bonjour,
D et NS sont-elles les seules mentions indicatives d'un type de dommage ?
A essayer (bouton Test pour tester) :
Sub DissocierDommages()
Dim lgn, ldmg, dmg, n&, i&, j%, ndm%
ldmg = Split("D NS")
With Worksheets("Brut")
n = .Cells(.Rows.Count, 1).End(xlUp).Row
Application.ScreenUpdating = False
For i = n To 2 Step -1
dmg = .Cells(i, 6)
For j = 0 To UBound(ldmg)
dmg = Replace(dmg, ldmg(j), "@" & ldmg(j))
Next j
dmg = Split(dmg, "@")
lgn = .Cells(i, 1).Resize(, 5).Value
For j = 1 To UBound(dmg)
.Rows(i + j).Insert
.Cells(i + j, 1).Resize(, 5).Value = lgn
.Cells(i + j, 6) = dmg(j)
Next j
Next i
End With
End SubCordialement.
edit : une petite erreur de ma part ! j'ai laissé la ligne origine intacte
C'est rectifié...
Sub DissocierDommages()
Dim lgn, ldmg, dmg, n&, i&, j%, ndm%
ldmg = Split("D NS")
With Worksheets("Brut")
n = .Cells(.Rows.Count, 1).End(xlUp).Row
Application.ScreenUpdating = False
For i = n To 2 Step -1
dmg = .Cells(i, 6)
For j = 0 To UBound(ldmg)
dmg = Replace(dmg, ldmg(j), "@" & ldmg(j))
Next j
dmg = Split(dmg, "@")
If UBound(dmg) > 1 Then
lgn = .Cells(i, 1).Resize(, 5).Value
.Cells(i, 6) = dmg(1)
For j = 1 To UBound(dmg) - 1
.Rows(i + j).Insert
.Cells(i + j, 1).Resize(, 5).Value = lgn
.Cells(i + j, 6) = dmg(j + 1)
Next j
End If
Next i
End With
End SubCordialement.
MFerrand a écrit :Bonjour,
D et NS sont-elles les seules mentions indicatives d'un type de dommage ?
Oups desolee je viens de voir le message ... non il y a aussi P
Je teste de suite ta solution
MFerrand a écrit :A essayer (bouton Test pour tester) :
Sub DissocierDommages() Dim lgn, ldmg, dmg, n&, i&, j%, ndm% ldmg = Split("D NS") With Worksheets("Brut") n = .Cells(.Rows.Count, 1).End(xlUp).Row Application.ScreenUpdating = False For i = n To 2 Step -1 dmg = .Cells(i, 6) For j = 0 To UBound(ldmg) dmg = Replace(dmg, ldmg(j), "@" & ldmg(j)) Next j dmg = Split(dmg, "@") lgn = .Cells(i, 1).Resize(, 5).Value For j = 1 To UBound(dmg) .Rows(i + j).Insert .Cells(i + j, 1).Resize(, 5).Value = lgn .Cells(i + j, 6) = dmg(j) Next j Next i End With End SubCordialement.
edit : une petite erreur de ma part ! j'ai laissé la ligne origine intacte
, je rectifie ça et je reviens. C'est rectifié...
Sub DissocierDommages() Dim lgn, ldmg, dmg, n&, i&, j%, ndm% ldmg = Split("D NS") With Worksheets("Brut") n = .Cells(.Rows.Count, 1).End(xlUp).Row Application.ScreenUpdating = False For i = n To 2 Step -1 dmg = .Cells(i, 6) For j = 0 To UBound(ldmg) dmg = Replace(dmg, ldmg(j), "@" & ldmg(j)) Next j dmg = Split(dmg, "@") If UBound(dmg) > 1 Then lgn = .Cells(i, 1).Resize(, 5).Value .Cells(i, 6) = dmg(1) For j = 1 To UBound(dmg) - 1 .Rows(i + j).Insert .Cells(i + j, 1).Resize(, 5).Value = lgn .Cells(i + j, 6) = dmg(j + 1) Next j End If Next i End With End SubCordialement.
C est exactement ca ... Merci
Mais pourquoi la commande (exemple 596477 - colonne B) ca a cree 3 lignes au lieu de 2 la macro a pris NS seul, par contre pour le commande 1294903 c est bon, mais la cde 564222 alors la la macro n a pas du tout aime !!!!
stephanietw a écrit :Bonjour
J ai un fichier extrait d une base de donnees (feuille 'Brut')
Seulement dans la colonne I (i) figure plusieurs types de dommages et j aimerai que chaque type soit sur une ligne et non pas tous les uns a cote des autres et que toutes les autres informations soient reprises
J ai mis un exemple en feuille 'exemple'
Ce fichier n ai qu une extraction dans la colonne I il peut il y avoir jusqu a plus de 10 types de dommages et le fichier comporte plus de 5000 lignes (donc le faire manuellement me prend bcp bcp bcp de temps)
Merci pour votre aide
Oups je pense que ca ne change rien (mais comme j avais supprime des colonnes les dommages sont en colonne f et non i (mais je pense que tu l avais compris !!! desolee
J'ai pas bien compris ! Tu as bien le bon fichier (normalement j'ai supprimé l'autre), et la bonne procédure (la dernière).
S'il y a un problème il faut donner les détails...
Pour intégrer P, il faut l'ajouter ici :
ldmg = Split("D NS")ligne qui devient alors :
ldmg = Split("D NS P")Attention aux espaces, c'est le séparateur...
MFerrand a écrit :J'ai pas bien compris ! Tu as bien le bon fichier (normalement j'ai supprimé l'autre), et la bonne procédure (la dernière).
S'il y a un problème il faut donner les détails...
Pour intégrer P, il faut l'ajouter ici :
ldmg = Split("D NS")ligne qui devient alors :
ldmg = Split("D NS P")Attention aux espaces, c'est le séparateur...
Ci joint un imprime ecran lorsque je lance la macro
Super pour le P
Mais il y a un soucis car il y a un dommage D qui ce nomme D - GP wore off
et il ya les dommage P (exemple P - Sent the wrong item, mais il y en a d autres ...)
En tous les cas tous les dommages commence par X - (Lettre espace tiret espace)
Je vois où est le problème ! Tout va se régler sur la ligne déjà modifiée, on va la modifier à nouveau... mais il faut la liste exhaustive de tous les dommages.
Pour l'instant on en est là :
ldmg = Split("D -;NS -;P -", ";")NB- Si tu peux répondre sans tout citer, on gagnera de la place, utilise les boutons 'Répondre'.