Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

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
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Re,
Une V4 à tester.
La largeur d'un champ est limité à 30 cellules, sinon changez :
VB:
ReDim Sortie(1 To 100000, 1 To 30)
Les "blancs" sont traités.

SVP, si problème fournissez un fichier vraiment représentatif.
 

Pièces jointes

  • Classeur1 (V4).xlsm
    41.2 KB · Affichages: 4

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
561
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…