IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Excel Discussion :

Diviser les différentes lignes d'une cellule en plusieurs lignes [XL-2010]


Sujet :

Excel

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 78
    Par défaut Diviser les différentes lignes d'une cellule en plusieurs lignes
    Bonjour,

    Je suis désolée si la question a été posée mais je ne trouve pas la réponse.

    Dans un tableau excel, j'ai une cellule qui contient une liste de nom prénom.
    Exemple : Cellule A1 =
    Anne Dupont
    Laurent Martin
    Isabelle Duprès
    Sylvie Bijoux
    Albert Dupontel

    Je souhaite avoir chaque nom prénom sur une ligne différente.

    Résultat Cellule :
    A1 Anne Dupont
    A2 Laurent Martin
    A3 Isabelle Duprès
    A4 Sylvie Bijoux
    A5 Albert Dupontel

    La fonction convertir ne me convient pas. Je ne sais pas comment faire.

    Je remercie la communauté pour votre aide.

    Cordialement,

    emma31

  2. #2
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 241
    Par défaut
    Bonjour,

    Essayez cette macro:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub Separation()
      Noms = Split(Range("A1"), Chr(10))
      Range("A1").Resize(UBound(Noms) + 1).Value = Application.Transpose(Noms)
    End Sub

    Cdlt

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 78
    Par défaut
    Citation Envoyé par ARTURO83 Voir le message
    Bonjour,

    Essayez cette macro:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub Separation()
      Noms = Split(Range("A1"), Chr(10))
      Range("A1").Resize(UBound(Noms) + 1).Value = Application.Transpose(Noms)
    End Sub

    Cdlt
    Bonjour,

    Cela n'a pas fonctionné. J'ai mis le fichier en pièce jointe pour être plus précise dans mon besoin.

    En tous cas merci pour aide.

    Cordialement.
    Fichiers attachés Fichiers attachés

  4. #4
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 241
    Par défaut
    Par rapport au fichier joint, pourriez-vous définir plus clairement votre besoin?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 78
    Par défaut
    Citation Envoyé par ARTURO83 Voir le message
    Par rapport au fichier joint, pourriez-vous définir plus clairement votre besoin?
    Dans la feuille 1 du classeur, il y a en ligne 7, 9 et 11 une cellule qui contient plusieurs Nom Prénom (service).

    Je souhaietrai avoir une ligne par personne avec son Nom Prénom (service).

    Est-ce que c'est possible ?

    Cordialement.

  6. #6
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 241
    Par défaut
    Voilà le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    Option Explicit
     
    Sub Separation()
        Dim f1 As Worksheet, f2 As Worksheet
        Dim DerLig_f1 As Long, i As Long, j As Long, Col_f2 As Long, Lig_f2 As Long, DerCol_f1 As Long
        Dim Noms
        Application.ScreenUpdating = False
        Set f1 = Sheets("Feuille 1")
        Set f2 = Sheets("Resultats")
        DerLig_f1 = f1.Range("A" & Rows.Count).End(xlUp).Row
        DerCol_f1 = f1.Range("C6").End(xlToRight).Column
        f2.Cells.ClearContents
        f1.Cells.Replace What:=",", Replacement:=")"
        f1.Cells.Replace What:="/", Replacement:=")"
        f1.Cells.Replace What:="))", Replacement:=")"
        Lig_f2 = 1
        For i = 7 To DerLig_f1 Step 2
            Col_f2 = 1
            For j = 3 To DerCol_f1
                On Error Resume Next
                Noms = Split(f1.Cells(i, j), ")")
                If Err.Number = 0 Then
                    f2.Cells(Lig_f2, Col_f2).Resize(UBound(Noms) + 1).Value = Application.Transpose(Noms)
                    On Error GoTo 0
                End If
                Col_f2 = Col_f2 + 1
            Next j
            Lig_f2 = f2.Range("A1").CurrentRegion.Rows.Count + 1
        Next i
        With f2.Cells
            .WrapText = False
            .HorizontalAlignment = xlLeft
            .VerticalAlignment = xlTop
            .EntireColumn.AutoFit
            .EntireRow.AutoFit
            .WrapText = True
        End With
        Set f1 = Nothing
        Set f2 = Nothing
    End Sub
    Je viens de voir après coup qu'il manque la parenthèse fermante dans la feuille "Résultats", si vous y tenez, je regarderai ça plus tard,

    emma31_Diviser les différentes lignes d'une cellule en plusieurs lignes.xlsm

    Cdlt

  7. #7
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 241
    Par défaut
    Petit complément, après l'export dans la feuille "Résultats", les noms sont triés par ordre alphabétique, et les doublons sont supprimés pour chaque colonne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    Option Explicit
        Dim f1 As Worksheet, f2 As Worksheet
        Dim DerLig_f1 As Long, i As Long, j As Long, Col_f2 As Long, Lig_f2 As Long, DerCol_f1 As Long
     
    Sub Separation()
        Dim Noms
        Application.ScreenUpdating = False
        Set f1 = Sheets("Feuille 1")
        Set f2 = Sheets("Resultats")
        DerLig_f1 = f1.Range("A" & Rows.Count).End(xlUp).Row
        DerCol_f1 = f1.Range("C6").End(xlToRight).Column
        f2.Cells.ClearContents
        f1.Cells.Replace What:=",", Replacement:=")"
        f1.Cells.Replace What:="/", Replacement:=")"
        f1.Cells.Replace What:="))", Replacement:=")"
        Lig_f2 = 1
        For i = 7 To DerLig_f1 Step 2
            Col_f2 = 1
            For j = 3 To DerCol_f1
                On Error Resume Next
                Noms = Split(f1.Cells(i, j), ")")
                If Err.Number = 0 Then
                    f2.Cells(Lig_f2, Col_f2).Resize(UBound(Noms) + 1).Value = Application.Transpose(Noms)
                    On Error GoTo 0
                End If
                Col_f2 = Col_f2 + 1
            Next j
            Lig_f2 = f2.Range("A1").CurrentRegion.Rows.Count + 1
        Next i
        f2.Select
        Tri_Suppr_Doublons
        With f2.Cells
            .WrapText = False
            .HorizontalAlignment = xlLeft
            .VerticalAlignment = xlTop
            .EntireColumn.AutoFit
            .EntireRow.AutoFit
            .WrapText = True
        End With
        Set f1 = Nothing
        Set f2 = Nothing
    End Sub
     
    Sub Tri_Suppr_Doublons()
        Application.DisplayAlerts = False
        For i = 1 To Lig_f2
            For j = 1 To DerCol_f1 - 2
                f2.Cells(i, j) = LTrim(f2.Cells(i, j))
            Next j
        Next i
        For i = 1 To DerCol_f1 - 2
            ActiveWorkbook.Worksheets("Resultats").Sort.SortFields.Clear
            ActiveWorkbook.Worksheets("Resultats").Sort.SortFields.Add2 Key:=Range(f2.Cells(1, i), f2.Cells(Lig_f2, i)), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
            With ActiveWorkbook.Worksheets("Resultats").Sort
                .SetRange Range(f2.Cells(1, i), f2.Cells(Lig_f2, i))
                .Header = xlNo
                .SortMethod = xlPinYin
                .Apply
            End With
            Range(f2.Cells(1, i), f2.Cells(Lig_f2, i)).RemoveDuplicates Columns:=1, Header:=xlNo
        Next i
    End Sub

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 78
    Par défaut
    Citation Envoyé par ARTURO83 Voir le message
    Petit complément, après l'export dans la feuille "Résultats", les noms sont triés par ordre alphabétique, et les doublons sont supprimés pour chaque colonne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    Option Explicit
        Dim f1 As Worksheet, f2 As Worksheet
        Dim DerLig_f1 As Long, i As Long, j As Long, Col_f2 As Long, Lig_f2 As Long, DerCol_f1 As Long
     
    Sub Separation()
        Dim Noms
        Application.ScreenUpdating = False
        Set f1 = Sheets("Feuille 1")
        Set f2 = Sheets("Resultats")
        DerLig_f1 = f1.Range("A" & Rows.Count).End(xlUp).Row
        DerCol_f1 = f1.Range("C6").End(xlToRight).Column
        f2.Cells.ClearContents
        f1.Cells.Replace What:=",", Replacement:=")"
        f1.Cells.Replace What:="/", Replacement:=")"
        f1.Cells.Replace What:="))", Replacement:=")"
        Lig_f2 = 1
        For i = 7 To DerLig_f1 Step 2
            Col_f2 = 1
            For j = 3 To DerCol_f1
                On Error Resume Next
                Noms = Split(f1.Cells(i, j), ")")
                If Err.Number = 0 Then
                    f2.Cells(Lig_f2, Col_f2).Resize(UBound(Noms) + 1).Value = Application.Transpose(Noms)
                    On Error GoTo 0
                End If
                Col_f2 = Col_f2 + 1
            Next j
            Lig_f2 = f2.Range("A1").CurrentRegion.Rows.Count + 1
        Next i
        f2.Select
        Tri_Suppr_Doublons
        With f2.Cells
            .WrapText = False
            .HorizontalAlignment = xlLeft
            .VerticalAlignment = xlTop
            .EntireColumn.AutoFit
            .EntireRow.AutoFit
            .WrapText = True
        End With
        Set f1 = Nothing
        Set f2 = Nothing
    End Sub
     
    Sub Tri_Suppr_Doublons()
        Application.DisplayAlerts = False
        For i = 1 To Lig_f2
            For j = 1 To DerCol_f1 - 2
                f2.Cells(i, j) = LTrim(f2.Cells(i, j))
            Next j
        Next i
        For i = 1 To DerCol_f1 - 2
            ActiveWorkbook.Worksheets("Resultats").Sort.SortFields.Clear
            ActiveWorkbook.Worksheets("Resultats").Sort.SortFields.Add2 Key:=Range(f2.Cells(1, i), f2.Cells(Lig_f2, i)), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
            With ActiveWorkbook.Worksheets("Resultats").Sort
                .SetRange Range(f2.Cells(1, i), f2.Cells(Lig_f2, i))
                .Header = xlNo
                .SortMethod = xlPinYin
                .Apply
            End With
            Range(f2.Cells(1, i), f2.Cells(Lig_f2, i)).RemoveDuplicates Columns:=1, Header:=xlNo
        Next i
    End Sub
    Surtement que je m'y prends mal car quand j'exécute la macro, j'ai un message d'erreur : Erreur de compilation : variable non définie.

    Je vous remercie infiniement pour le temps que vous prenez pour mon problème excell.

    Cordialement

  9. #9
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 241
    Par défaut
    Bizarre, pourtant toutes les variables sont déclarées et chez moi je n'ai pas ce problème.
    Revoici le fichier avec quelques modifications. S'il subsiste des noms en apparence en doublons, c'est qu'au niveau de la "feuille 1" ils sont enregistrés quelque peu différemment.
    emma31_Diviser les différentes lignes d'une cellule en plusieurs lignes_2.xlsm

    Cdlt

  10. #10
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 178
    Par défaut
    Hello,
    je n'ai peut-être pas bien compris ce que tu veux faire mais si c'est en fait dans une même cellule de ranger les personnes une par ligne, voici une macro qui réalise cela.
    Le principe :
    1 - On sélectionne la cellule ou les cellules où l'on veut faire la manipulation (multi sélection possible) ou bien on force la sélection (décommenter la ligne avec Union dans le code)) puis on lance la macro
    2 - La macro va lire chaque cellule sélectionnée en effectuant le traitement suivant :
    1 - Si une personne n'a pas de service renseigné on lui met (?) derrière son nom. Elimination des virgules et des vbLf.
    2 - Mise en place d'une expression régulière qui extrait des morceaux constitués du nom prénom suivi par quelque chose entre parenthèses.
    3 - les morceaux sont assemblés ensemble en ajoutant un vblf après chaque morceau.
    4 - On réécrit la cellule en traitement avec les morceaux réassemblés.


    Pour l'instant la macro ne fait pas la substitution dans les cellules. Il faut décommenter la ligne 'rng.Value = pour le faire.
    Il y a des cellules avec double nom séparé par un / . Comme je ne sais pas ce qu'il faut faire dans ce cas-là j'ai laissé. Il doit y avoir aussi d'autres cas "foireux".
    Voici la macro :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    Sub Separation()
        Dim strTest As String, res As String
        Dim regEx As Object, Matches As Object, Match As Object
        Dim rng As Range
            'Union(Range("C7:AT7"), Range("C9:AT9"), Range("C11:AT11")).Select
            For Each rng In Selection
            strTest = rng.Value
            strTest = Replace(strTest, "),", ") ")
            strTest = Replace(strTest, vbLf, " ")
            strTest = Replace(strTest, ",", " (?) ")
            ' Création de l'objet RegExp
            Set regEx = CreateObject("VBScript.RegExp")
            regEx.Global = True
            regEx.IgnoreCase = True
            regEx.Pattern = "[,]*(.*?\(.*?\))" ' Expression régulière pour trouver  *(*)
            ' Recherche d'une correspondance avec l'expression régulière
            Set Matches = regEx.Execute(strTest)
            res = ""
            For Each Match In Matches
              'Debug.Print Trim(Match.submatches(0))
              res = res + Trim(Match.submatches(0)) + vbLf
            Next
            If res <> "" Then
               Debug.Print "==================="
               Debug.Print Left(res, Len(res) - 1)
               'rng.Value = Left(res, Len(res) - 1)
            End If
        Next rng
    End Sub
    Et voilà ce que cela donne :
    Nom : Sepa.gif
Affichages : 342
Taille : 201,1 Ko

    Ami calmant, J.P

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 78
    Par défaut
    Citation Envoyé par jurassic pork Voir le message
    Hello,
    je n'ai peut-être pas bien compris ce que tu veux faire mais si c'est en fait dans une même cellule de ranger les personnes une par ligne, voici une macro qui réalise cela.
    Le principe :
    1 - On sélectionne la cellule ou les cellules où l'on veut faire la manipulation (multi sélection possible) ou bien on force la sélection (décommenter la ligne avec Union dans le code)) puis on lance la macro
    2 - La macro va lire chaque cellule sélectionnée en effectuant le traitement suivant :
    1 - Si une personne n'a pas de service renseigné on lui met (?) derrière son nom. Elimination des virgules et des vbLf.
    2 - Mise en place d'une expression régulière qui extrait des morceaux constitués du nom prénom suivi par quelque chose entre parenthèses.
    3 - les morceaux sont assemblés ensemble en ajoutant un vblf après chaque morceau.
    4 - On réécrit la cellule en traitement avec les morceaux réassemblés.


    Pour l'instant la macro ne fait pas la substitution dans les cellules. Il faut décommenter la ligne 'rng.Value = pour le faire.
    Il y a des cellules avec double nom séparé par un / . Comme je ne sais pas ce qu'il faut faire dans ce cas-là j'ai laissé. Il doit y avoir aussi d'autres cas "foireux".
    Voici la macro :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    Sub Separation()
        Dim strTest As String, res As String
        Dim regEx As Object, Matches As Object, Match As Object
        Dim rng As Range
            'Union(Range("C7:AT7"), Range("C9:AT9"), Range("C11:AT11")).Select
            For Each rng In Selection
            strTest = rng.Value
            strTest = Replace(strTest, "),", ") ")
            strTest = Replace(strTest, vbLf, " ")
            strTest = Replace(strTest, ",", " (?) ")
            ' Création de l'objet RegExp
            Set regEx = CreateObject("VBScript.RegExp")
            regEx.Global = True
            regEx.IgnoreCase = True
            regEx.Pattern = "[,]*(.*?\(.*?\))" ' Expression régulière pour trouver  *(*)
            ' Recherche d'une correspondance avec l'expression régulière
            Set Matches = regEx.Execute(strTest)
            res = ""
            For Each Match In Matches
              'Debug.Print Trim(Match.submatches(0))
              res = res + Trim(Match.submatches(0)) + vbLf
            Next
            If res <> "" Then
               Debug.Print "==================="
               Debug.Print Left(res, Len(res) - 1)
               'rng.Value = Left(res, Len(res) - 1)
            End If
        Next rng
    End Sub
    Et voilà ce que cela donne :
    Nom : Sepa.gif
Affichages : 342
Taille : 201,1 Ko

    Ami calmant, J.P
    Je voulais vraiment te remercier pour ton aide précieuse et ta grande disponibilté. J'ai beaucoup appris et ça m'a aidé.
    C'est vraiment super.

    Un grand merci.

    Emma

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-MAC 2011] Macro pour dupliquer les champs d'une cellule en plusieurs lignes
    Par AudreyAQF dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 10/06/2016, 15h17
  2. [XL-2007] scinder les info d'une cellule en plusieurs lignes
    Par henry41 dans le forum Excel
    Réponses: 14
    Dernier message: 13/04/2012, 09h40
  3. Quels sont les différents états qu'une cellule excel peut avoir ?
    Par planete.gonz dans le forum Macros et VBA Excel
    Réponses: 17
    Dernier message: 07/11/2008, 17h15
  4. [TStringGrid] Une cellule sur plusieurs lignes.
    Par Caine dans le forum Delphi
    Réponses: 15
    Dernier message: 28/03/2007, 12h53
  5. Comment récuperer les différentes lignes d'une requête ?
    Par frikazoide dans le forum Langage SQL
    Réponses: 5
    Dernier message: 25/01/2007, 08h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo