Fonction SPLIT [Résolu/Fermé]

Signaler
-
Messages postés
12247
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
10 février 2021
-
Bonjour,

J'ai n cellules dans une colonne. Les n cellules contiennent de 1 à n lignes.
Je souhaite dissocier ces lignes dans une autre colonne.

La macro fonctionne si je définie une cellule (ex. B1). En revanche pour une plage, j'ai toujours une erreur.

Ci-dessous la macro en question :

Sub decoupe2()
Dim s As Variant, i As Byte
s = Split(Range("B" & Rows.Count), Chr(10))
For i = 0 To UBound(s)
    Cells(i + 1, 3).Value = s(i)
Next i
End Sub


Merci de votre aide !

4 réponses

Messages postés
12247
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
10 février 2021
2 575
Bonjour,

Avec restitution à partir de la colonne C :
Dim DL As Long, Lig As Long, Col As Integer, s As Variant, i As Byte
DL = Columns(2).Find("*", , , , xlByColumns, xlPrevious).Row 
Col = 3
For Lig = 1 To DL
    If Instr(Range("B" & Lig), Chr(10)) > 0 Then
        s = Split(Range("B" & Lig), Chr(10))
        For i = 0 To UBound(s)
            Cells(i + 1, Col).Value = s(i)
        Next i
        Col = Col + 1
    End If
Next Lig


Code non testé, écrit "à l'arrache"...
Merci pour ta réponse pijaku, la macro fonctionne parfaitement !
Est-il possible de mettre le contenu des lignes l'une à la suite des autres et non en changeant de colonne ?
Messages postés
12247
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
10 février 2021
2 575 > Nico
Oui.
Regarde la solution de Thev (salutations au passage).
Messages postés
1769
Date d'inscription
lundi 7 avril 2008
Statut
Membre
Dernière intervention
15 juin 2020
593
Bonjour,

ci-dessous autre solution à partir de la colonne C

Sub dissocier()

Dim xl As Excel.Application
Dim cellule As Range
Dim nb_lignes As Integer, i As Long
Dim s() As String

Set xl = Application
For Each cellule In Columns("B").SpecialCells(xlCellTypeConstants)
s = Split(cellule, Chr(10))
nb_lignes = UBound(s) + 1
i = cellule.Row ' numéro de ligne de la plage
Cells(i, "C").Resize(, 2).Value = xl.Transpose(xl.Transpose(s))
Next cellule

End Sub



 
Merci Thev pour ton retour.
Lorsque je lance la macro, j'ai une erreur sur le point suivant
Cells(i, "C").Resize(, 2).Value = xl.Transpose(xl.Transpose(s))
Messages postés
1769
Date d'inscription
lundi 7 avril 2008
Statut
Membre
Dernière intervention
15 juin 2020
593
Petit oubli suite à mon test

la bonne instruction est :
Cells(i, "C").Resize(, nb_lignes).Value = xl.Transpose(xl.Transpose(s))


refourniture du code complet

Sub découpe()

Dim xl As Excel.Application
Dim cellule As Range
Dim nb_lignes As Integer, i As Long
Dim s() As String

Set xl = Application
For Each cellule In Columns("B").SpecialCells(xlCellTypeConstants)
s = Split(cellule, Chr(10))
nb_lignes = UBound(s) + 1
i = cellule.Row ' numéro de ligne de la plage
Cells(i, "C").Resize(, nb_lignes).Value = xl.Transpose(xl.Transpose(s))
Next cellule

End Sub
Messages postés
12247
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
10 février 2021
2 575
Petite modif ddu code de Thev (au cas ou il y a dans une même cellule 2 passages à la ligne) :
Sub dissocier()
    
    Dim xl As Excel.Application
    Dim cellule As Range
    Dim nb_lignes As Integer, i As Long
    Dim s() As String
    
    Set xl = Application
    For Each cellule In Columns("B").SpecialCells(xlCellTypeConstants)
        s = Split(cellule, Chr(10))
        nb_lignes = UBound(s) + 1
        i = cellule.Row         ' numéro de ligne de la plage
        Cells(i, "C").Resize(, UBound(s) + 1).Value = xl.Transpose(xl.Transpose(s))
    Next cellule
End Sub


Et avec les données à la suite en colonne C :
Sub MachinTruc()
Dim DL As Long, DLB As Long, Lig As Long, s As Variant, i As Byte

DL = Columns(2).Find("*", , , , xlByColumns, xlPrevious).Row
DLB = 2 ' ==> 1ère ligne de restitution colonne C

For Lig = 1 To DL
    If InStr(Range("B" & Lig), Chr(10)) > 0 Then
        s = Split(Range("B" & Lig), Chr(10))
        For i = 0 To UBound(s)
            Cells(DLB, 3).Value = s(i)
            DLB = DLB + 1
        Next i
    Else
        Cells(DLB, 3).Value = Cells(Lig, 2)
        DLB = DLB + 1
    End If
Next Lig
End Sub

Messages postés
1769
Date d'inscription
lundi 7 avril 2008
Statut
Membre
Dernière intervention
15 juin 2020
593
modif de mon code OK.
Cela dit, mon code met bien les données à la suite, de la colonne C à la colonne C+n
Messages postés
12247
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
10 février 2021
2 575 >
Messages postés
1769
Date d'inscription
lundi 7 avril 2008
Statut
Membre
Dernière intervention
15 juin 2020

Cela dit, mon code met bien les données à la suite, de la colonne C à la colonne C+n
Oui thev.
J'ai bien vu ça...


A++
Vous êtes au top !
Merci les gars