XL 2021 Découper une ligne en plusieurs lignes en fonction d'un caractère

natorp

XLDnaute Barbatruc
Bonjour tout le monde

J'aimerais découper une ligne en plusieurs lignes en fonction du caractère ]
Dès que je trouve le caractère ] dans la ligne, je coupe jusqu'au prochain et je copie à la ligne suivante
J'ai un fichier très important à traiter, je vous joins un exemple

Merci pour votre aide, cordialement, Gérard
 

Pièces jointes

  • Classeur1.xlsx
    10.2 KB · Affichages: 10
Solution
Une solution très rapide qui utilise la commande Convertir :
VB:
Sub Eclate()
Dim a, s
a = ActiveSheet.UsedRange.Rows(1)
a = Application.Transpose(Application.Transpose(a))
s = Split(Join(a, vbTab), "]")
Rows("3:" & Rows.Count).ClearContents 'RAZ
With [A3].Resize(UBound(s) + 1)
    .Value = Application.Transpose(s)
    .TextToColumns .Cells(1), xlDelimited, Tab:=True 'commande Convertir
End With
End Sub
Il ne paraît pas utile d'ajouter "]" au début de A4 A5 A6.

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Nathorp, Dudu,
Un exemple en PJ avec :
VB:
Sub Découpe()
Dim T, L%, C%
Application.ScreenUpdating = False
[A4:Z1000].ClearContents
T = [A1].CurrentRegion
L = 3: C = 1
For i = 1 To UBound(T, 2)
    If Left(T(1, i), 1) = "]" Then
        L = L + 1: C = 1
    Else
        C = C + 1
    End If
    Cells(L, C) = T(1, i)
Next i
End Sub
 

Pièces jointes

  • Classeur1 (1).xlsm
    15 KB · Affichages: 1

alexga78

XLDnaute Occasionnel
Bonjour à tous,

Une approche Power Query.

PowerQuery:
let
A = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
B = Table.Combine(List.TransformMany(Table.ToRows(A),
    each List.Transform({_}, each Table.Group(Table.FromList(_, each {_},{"x"}), "x", {"y",     
    each [x]},0, (x,y)=> Byte.From(y = "]TONREP"))[y]), (x,y)=> Table.FromRows(y)))
in
B

Cordialement
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Re, bonjour le fil,
En passant par un array de sortie pour accélérer les choses :
VB:
Sub Découpe()
Dim T, L%, C%, Sortie
[A4:Z100000].ClearContents
ReDim Sortie(1 To 100000, 1 To 7)
T = [A1:FRZ1]
L = 1: C = 1
For i = 1 To UBound(T, 2)
    If T(1, i) = "" Then Exit For
    If Left(T(1, i), 1) = "]" Then
        L = L + 1: C = 1
    Else
        C = C + 1
    End If
    Sortie(L, C) = T(1, i)
Next i
[A4].Resize(UBound(Sortie, 1), UBound(Sortie, 2)) = Sortie
End Sub
 

Pièces jointes

  • Classeur1 (V3).xlsm
    96.5 KB · Affichages: 0

natorp

XLDnaute Barbatruc
Merci Sylvanu

J'ai une erreur sur la ligne "Sortie(L, C) = T(1, i)" : l'indice n'appartient pas à la sélection
Oups, ça vient de mon fichier original qui a plus de colonne entre 2 ]
Mais après correction, la macro ne traite pas toutes les colonnes
Je n'obtiens que 20 lignes alors qu'il devrait y en avoir beaucoup plus

Cordialement, Gérard
 

job75

XLDnaute Barbatruc
Une solution très rapide qui utilise la commande Convertir :
VB:
Sub Eclate()
Dim a, s
a = ActiveSheet.UsedRange.Rows(1)
a = Application.Transpose(Application.Transpose(a))
s = Split(Join(a, vbTab), "]")
Rows("3:" & Rows.Count).ClearContents 'RAZ
With [A3].Resize(UBound(s) + 1)
    .Value = Application.Transpose(s)
    .TextToColumns .Cells(1), xlDelimited, Tab:=True 'commande Convertir
End With
End Sub
Il ne paraît pas utile d'ajouter "]" au début de A4 A5 A6.
 

Pièces jointes

  • Classeur1.xlsm
    16.3 KB · Affichages: 7

Discussions similaires

Réponses
20
Affichages
662

Statistiques des forums

Discussions
315 127
Messages
2 116 499
Membres
112 765
dernier inscrit
SIDIANW