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 :

Grouper des données texte avec excel


Sujet :

Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 2
    Par défaut Grouper des données texte avec excel
    Bonjour,

    Voila je voudrais réaliser une macro qui me permette de regrouper des données.

    Feuille excel de base (exemple)

    colonne A B

    500 6
    500 7
    500 3
    500 4
    400 5
    400 7
    300 2

    ce que je voudrais aprés l'execution de la macro c'est

    colonne A B

    500 6-7-3-4
    400 5-7
    300 2

    merci pour vos solutions

    thierry

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut

    Cela me semble impossible sans VBA. Voici une procédure. Il y a peut-être plus simple

    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
    Sub Classer()
        Dim Cellule As Range
        Dim Cellule1 As Range
        Dim i As Long
     
        Set Cellule = Range("a1")
        Do While Cellule.Row <= Range("a" & Rows.Count).End(xlUp).Row
            Cellule(1, 2).Value = "'" & Cellule(1, 2).Value
            Set Cellule1 = Cellule(2)
            Do While Not IsEmpty(Cellule1)
                If Cellule.Value = Cellule1.Value Then
                    Cellule(1, 2).Value = "'" & Cellule(1, 2).Value & "-" & Cellule1(1, 2).Value
                    Cellule1(1, 2).ClearContents
                    Set Cellule1 = Cellule1(2)
                    Else
                    Exit Do
                End If
            Loop
            Set Cellule = Cellule1
        Loop
     
        ' Suppression des lignes pour lesquelles la colonne B est vide
        i = Range("a" & Rows.Count).End(xlUp).Row
        For i = Range("a" & Rows.Count).End(xlUp).Row To 1 Step -1
            If IsEmpty(Cells(i, 2)) Then Rows(i).EntireRow.Delete
        Next i
    End Sub
    On boucle tant qu'il y a des valeurs en A
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Set Cellule = Range("a1")
        Do While Cellule.Row <= Range("a" & Rows.Count).End(xlUp).Row
    La ligne suivante permet d'obtenir du texte dans la cellule (important si la dernière cellule de A commence un nouveau groupe)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cellule(1, 2).Value = "'" & Cellule(1, 2).Value
    On positionne Cellule1 sur la cellule juste en dessous de Cellule et on boucle tant qu'elle n'est pas vide
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
           Set Cellule1 = Cellule(2)
            Do While Not IsEmpty(Cellule1)
    Si les valeurs de Cellule et de Cellule1 sont égales, on ajoute la valeur de Cellule1 à la valeur de la cellule à droite de Cellule et on vide la cellule à droite de Cellule1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
               If Cellule.Value = Cellule1.Value Then
                    Cellule(1, 2).Value = "'" & Cellule(1, 2).Value & "-" & Cellule1(1, 2).Value
                    Cellule1(1, 2).ClearContents
    On descend Cellule1 d'une ligne et on repart
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                    Set Cellule1 = Cellule1(2)
    Si les valeurs de Cellule et de Cellule1 sont différentes ou si Cellule1 est vide,on sort de la boucle et on positionne Cellule sur Cellule1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                    Set Cellule1 = Cellule1(2)
    , puis on repart en testant si Cellule est toujours dans la plage concernée.

    Après, il suffit de supprimer les lignes, en remontant de bas en haut, pour lesquelles la cellule en B est vide.

    A adapter à ton cas.

    Ok?
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  3. #3
    Membre chevronné
    Avatar de Bigalo
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    445
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 445
    Par défaut
    Bonsoir,

    Autre solution, en principe très rapide à l’exécution, car il n’y a aucune suppression de ligne :

    Comme Pierre, je pense que VBA est indispensable.

    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
    Sub MAJ()
    Dim c As Range, f As Worksheet, PlageRef As Range, Ref As Range, i As Integer, c2, Chaine As String
        Set f = ActiveSheet ' A adapter
        Set PlageRef = Intersect(f.UsedRange, f.Range("A:A"))
        Set Ref = PlageRef.Cells(1, 1)
            For Each c In PlageRef
                    If WorksheetFunction.CountIf(Range(Ref, c), c) = 1 Then
                        Chaine = ""
                            For Each c2 In PlageRef.Offset(0, 1)
                                Chaine = Chaine & IIf(c2.Offset(0, -1) = c, "-" & c2, "")
                            Next
                        Ref.Offset(i) = c
                        Ref.Offset(i, 1) = "'" & Mid(Chaine, 2, Len(Chaine) - 1)
                        i = i + 1
                    End If
            Next
        Range(Ref.Offset(i), Ref.Offset(PlageRef.Rows.Count - 1, 1)).ClearContents
    End Sub
    On définit une plage de référence, PlageRef, intersection de la colonne A de la partie "utile" de la feuille de calcul, et on nomme Ref la première cellule de cette plage en colonne A.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     Set PlageRef = Intersect(f.UsedRange, f.Range("A:A"))
        Set Ref = PlageRef.Cells(1, 1)
    On boucle dans les cellules de PlageRef, avec une boucle For Each. On teste si c’est la première fois qu’une valeur est rencontrée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                    If WorksheetFunction.CountIf(Range(Ref, c), c) = 1 Then
    COUNTIF() est le version en anglais de NB.SI(). On teste donc si NB.SI(Ref:c;c) est égal à 1. Si c’est le cas, on initialise une variable, Chaine comme texte vide, et on boucle dans les cellules situées à coté de PlageRef, en colonne B. A chaque passage dans la boucle, si la valeur en colonne A, sur la même ligne que c2 (la cellule dans laquelle on passe via la boucle) est égale à c, on ajoute à Chaine un tiret, et le contenu de c2.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                        Chaine = ""
                            For Each c2 In PlageRef.Offset(0, 1)
                                Chaine = Chaine & IIf(c2.Offset(0, -1) = c, "-" & c2, "")
                            Next
    A la fin de cette boucle, on inscrit en colonne A la valeur de c, en colonne B celle de Chaine en y ajoutant "'" pour que le contenu soit traité comme du texte, et en supprimant le premier tiret. On incrémente également de 1, une variable ,i, afin que le report suivant se fasse à la ligne suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                        Ref.Offset(i) = c
                        Ref.Offset(i, 1) = "'" & Mid(Chaine, 2, Len(Chaine) - 1)
                        i = i + 1
    Enfin, à la fin de la boucle à travers PlageRef, on efface les données résiduelles en colonne A et B, situées au-delà des derniers éléments reportés.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            Next
        Range(Ref.Offset(i), Ref.Offset(PlageRef.Rows.Count - 1, 1)).ClearContents
    Cordialement,

  4. #4
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 2
    Par défaut
    Merci pour vos réponses,

    j'ai commencé a bricoler mon fichier d'origine pour appliquer le 1° programme VBA,je vous tiens informé du résultat.Et encore merci pour tout.

    THIERRY

Discussions similaires

  1. Grouper des données avec condition
    Par jzb10n dans le forum Excel
    Réponses: 3
    Dernier message: 21/01/2015, 11h01
  2. comment consolider des données textes sous excel?
    Par Paulopiv dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 22/10/2012, 13h35
  3. Utiliser des données XML avec Excel ?
    Par sky1989 dans le forum Excel
    Réponses: 3
    Dernier message: 29/03/2012, 21h48
  4. Récupérer des données CSV avec Excel
    Par mmmxtina dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 26/06/2009, 14h54
  5. [TComPort] Analyse des données reçues avec ReadStr
    Par chourmo dans le forum Langage
    Réponses: 4
    Dernier message: 22/06/2005, 14h12

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