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

Macros et VBA Excel Discussion :

Regrouper les cellules qui ont un contenu identique


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club Avatar de Iloon
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 70
    Points : 50
    Points
    50
    Par défaut Regrouper les cellules qui ont un contenu identique


    Bonjour à tous, comme l'indique l'intitulé de ma question, je tente de regrouper les cellules qui ont un contenu identique mais je n'y arrive pas.
    En fait, j'ai un tableau Excel contenant une liste et dans la première colonne, je voudrais que les informations ne se répètent pas, tout en conservant l'intégrité des données .
    Je vous donne un exemple :
    A 1 2
    A 2 3
    B 4 5
    Je voudrais que cela donne :
    A |1 | 2
    [vide] |2 | 3
    B |4 | 5

    Voilà voilà, j'espère que mes explications suffiront à vous expliquer correctement mon problème, merci beaucoup par avance,
    Iloon

  2. #2
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 121
    Points : 119
    Points
    119
    Par défaut
    comme je suppose que cette routine ne sera utilisée qu'une fois, je propose :

    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
     
    Sub test()
     
    Dim val As String, valad As String
     
        Range("C2").Select
        Do Until ActiveCell.Value = ""
            val = ActiveCell.Value
            valad = ActiveCell.Address
     
            Do Until val <> ActiveCell.Value
                ActiveCell.Offset(1, 0).Select
     
            Loop
            ActiveCell.Offset(-1, 0).Select
            Range(valad, ActiveCell.Address).Select
            With Selection
                .Merge
                .VerticalAlignment = xlTop
            End With
            ActiveCell.Offset(1, 0).Select
        Loop
    End Sub

  3. #3
    Membre confirmé
    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
    Points : 563
    Points
    563
    Par défaut
    Bonjour iloon,

    Bienvenue sur ce forum

    Voici qui devrait faire l’affaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub Test()
    Dim c As Range, Ref As Range, LigneDebut As Long, LigneFin As Long, i As Integer
        Set Ref = Intersect(ActiveSheet.UsedRange, Range("A:A"))
        LigneDebut = Ref.Row
        LigneFin = LigneDebut + Ref.Rows.Count - 1
            For i = LigneFin To LigneDebut Step -1
                If Range("A" & i) = Range("A" & i - 1) Then Range("A" & i).ClearContents
            Next
    End Sub
    Il faut

    • Que la feuille à traiter soit la feuille active,
    • Adapter le code, si la première colonne de ta liste n’est pas la colonne A


    Voilà.

  4. #4
    Membre du Club Avatar de Iloon
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 70
    Points : 50
    Points
    50
    Par défaut
    Merci à vous deux, je vais essayer les deux et je vous dis ce que ça donne

  5. #5
    Membre du Club Avatar de Iloon
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 70
    Points : 50
    Points
    50
    Par défaut
    Merci à vous deux, je vais essayer les deux et je vous dis ce que ça donne

    Bon alors, Bigalo, ton code tourne en boucle sur ces deux lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    If Range ("A" & i) = Range ("A" & i - 1) Then Range ("A" & i).ClearContents
    Next
    mais aucune action n'est faite, les cellules ne sont pas sélectionnées dans mon fichier (lorsque j'exécute la macro pas à pas). (Le passage en italique n'est même pas surligné lors de l'exécution pas à pas)

    Pour ton code remiT, il fonctionne mais lorsque les deux cellules fusionne, il y a un pop up me demandant si je veux bien fusionner les cellules ce qui ne conservera que les données de la cellule supérieure gauche.

    Il y a t'il un moyen d'éviter ce message d'erreur ? Car sinon le code fonctionne très bien.

    Merci à vous deux en tout cas,

    Iloon

  6. #6
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 121
    Points : 119
    Points
    119
    Par défaut
    voilà,

    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 test()
     
    Dim val As String, valad As String
     
        Range("C2").Select
        Do Until ActiveCell.Value = ""
            val = ActiveCell.Value
            valad = ActiveCell.Address
            flag = True
            Do While val = ActiveCell.Value
                ActiveCell.Offset(1, 0).Select
                If flag = False Then
                    ActiveCell.Offset(-1, 0).ClearContents
                End If
                flag = False
            Loop
            ActiveCell.Offset(-1, 0).Select
            Range(valad, ActiveCell.Address).Select
            With Selection
                .Merge
                .MergeCells = True
                .VerticalAlignment = xlTop
            End With
            ActiveCell.Offset(1, 0).Select
        Loop
    End Sub

  7. #7
    Membre confirmé
    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
    Points : 563
    Points
    563
    Par défaut
    Citation Envoyé par iloon Voir le message
    Bon alors, Bigalo, ton code tourne en boucle sur ces deux lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                If Range("A" & i) = Range("A" & i - 1) Then Range("A" & i).ClearContents
    mais aucune action n'est faite, les cellules ne sont pas sélectionnées dans mon fichier.
    Heureusement encore, que les cellules ne sont pas sélectionnées ! L’un des intérêts essentiels de VBA est de pouvoir lire ou modifier les propriétés d'un objet SANS qu’il soit nécessaire de le sélectionner au préalable ! Sélectionner les cellules est une technique de débutant : cela ralentit l'exécution et est à éviter à peu près systématiquement.

    Mon code balaye les cellules en colonne A et efface celles qui sont identiques au contenu de la cellule située sur la ligne juste au-dessus.

    Si ta colonne A est vide ou ne contient pas 2 cellules consécutives vides, rien ne se passe. C’'est pour cela que je t’ai indiqué qu’il était nécessaire d’adapter le code si ta liste ne commence pas en colonne A !

  8. #8
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 121
    Points : 119
    Points
    119
    Par défaut
    Iloon,

    tu as ici 2 solutions qui fonctionne.

    - 1 solution de débutant facilement accessible ( la mienne ) qui demande à VBA de faire ce que tu ferais a la main.

    - 1 solution de pro, incompréhensible pour les débutants qui utilise toute la "puissance" de la programmation VBA.

    Il est clair que si tu avais 150 fichiers avec chacun 1 000 000 de lignes à traiter, il te faudrait utiliser la 2eme solution mais je ne pense pas que ce soit le cas.

    Maintenant, si tu es capable de modifier la seconde solution de Bigalo, fais le et tu auras la meilleure solution.
    Pour ma part, si j'étais capable de comprendre et de modifier cette solution, je pourrais la faire moi-meme ce qui est loin d'etre le cas...

  9. #9
    Membre du Club Avatar de Iloon
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 70
    Points : 50
    Points
    50
    Par défaut
    Merci beaucoup remiT, le code fonctionne.

    Je ferme ce sujet mais je pense que j'en ouvrirai d'autres si je ne trouve pas la réponse dans le forum, j'ai encore quelques difficultés.

    Merci d'avoir répondu si vite en tout cas, bonne continuation

  10. #10
    Membre du Club Avatar de Iloon
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 70
    Points : 50
    Points
    50
    Par défaut
    Bigalo, j'ai vu ce message après avoir mis ce problème en résolu.
    Mon fichier contient près de 450 lignes et la colonne a traiter est bien la A, je ne sais donc pas pourquoi cela ne fonctionne pas.

    Sinon remiT, tu as raison, je n'ai pas les capacités pour rédiger en mode "professionnel", mais ta solution me convient et en plus je la comprends, ce qui n'est pas le cas de l'autre solution possible !

    De plus, je peux continuer à travailler comme cela car ce n'est pas un problème pour moi que la macro soit lente, je n'aurais à faire cette manipulation qu'une fois par an, donc elle peut mettre une semaine à s'exécuter, ce ne sera pas grave !

    Merci encore

  11. #11
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 121
    Points : 119
    Points
    119
    Par défaut
    Merci Iloon...

    NO OTHER COMMENT

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

Discussions similaires

  1. [XL-2007] Retrouver toutes les lignes qui ont une valeur identique dans la colonne A
    Par bartimeus35 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 24/06/2012, 17h47
  2. Réponses: 3
    Dernier message: 08/03/2010, 13h36
  3. [XSLT] Regrouper les noeuds qui se ressemblent
    Par yos dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 19/10/2006, 16h51
  4. supprimer les fichiers qui ont des mêmes noms
    Par manaboko dans le forum Langage
    Réponses: 5
    Dernier message: 08/03/2006, 09h09
  5. Selectionner les date qui ont minimum une heure d'ecart
    Par uraxyd dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 26/07/2005, 13h39

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