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 :

Comparer 2 listes de noms [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 36
    Points : 27
    Points
    27
    Par défaut Comparer 2 listes de noms
    Bonjour,

    J'ai 2 liste de nom trié de A à Z comme ceci :

    colonne A | colonne B
    
    arthur    | arthur
    albert    | anthone
    anthone   | beatrice
    bernard   | bernard
    michelle  | melanie
    olivier   | michelle
              | olivier
    Je veux en résultat une modification des colonnes A et B :

    arthur    | arthur
    albert    |
    anthone   | anthone
              | beatrice
    bernard   | bernard
              | melanie
    michelle  | michelle
    olivier   | olivier
    Je ne sais comment procéder..

    Avez-vous une idée svp ?
    Merci c'est très urgent.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 203
    Points : 14 354
    Points
    14 354
    Par défaut
    Bonjour,

    Essaie :

    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
    Sub test1()
    Dim Plage As Range, Tabl, C As Range, Ligne As Long, I As Long
    Set Plage = Range("A1", Cells(Rows.Count, 1).End(xlUp))
    Tabl = Application.Transpose(Range("B1", Cells(Rows.Count, 2).End(xlUp)))
    [B:B].ClearContents
    For Each C In Plage
        If IsNumeric(Application.Match(C.Value, Tabl, 0)) Then
            C.Offset(, 1).Value = C.Value
        End If
    Next C
    Ligne = Plage.Rows.Count
    For I = 1 To UBound(Tabl)
        If Not IsNumeric(Application.Match(Tabl(I), Plage, 0)) Then
            Ligne = Ligne + 1
            Cells(Ligne, 1) = Tabl(I)
        End If
    Next I
    Range("A1", Cells(Rows.Count, 1).End(xlUp)).Resize(, 2).Sort [A1], xlAscending
    End Sub
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 36
    Points : 27
    Points
    27
    Par défaut
    tout d'abord, merci pour ton script,

    C'est pas totalement sa,
    en faite il me met tout les noms sur la colonne A sauf ceux qui étaient dans la colonne A et B.
    Moi ce que je veux c'est pas qu'il transfère un nom de la A vers la B mais juste qu'il les aligne et que si il ne trouve pas de correspondance il laisse un blanc en face.

    Me comprends-tu ?

  4. #4
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 203
    Points : 14 354
    Points
    14 354
    Par défaut
    Pas sûr d'avoir compris, mais le résultat est celui que tu donnes, au tri près :

    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
    Sub test1()
    Dim Plage As Range, Tabl, C As Range, Ligne As Long, I As Long
    Set Plage = Range("A1", Cells(Rows.Count, 1).End(xlUp))
    Tabl = Application.Transpose(Range("B1", Cells(Rows.Count, 2).End(xlUp)))
    [B:B].ClearContents
    For Each C In Plage
        If IsNumeric(Application.Match(C.Value, Tabl, 0)) Then
            C.Offset(, 1).Value = C.Value
        End If
    Next C
    Ligne = Plage.Rows.Count
    For I = 1 To UBound(Tabl)
        If Not IsNumeric(Application.Match(Tabl(I), Plage, 0)) Then
            Ligne = Ligne + 1
            Cells(Ligne, 2) = Tabl(I)
        End If
    Next I
    Range("A1", Cells(Rows.Count, 1).End(xlUp)).Resize(, 2).Sort [A1], xlAscending
    End Sub
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  5. #5
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 434
    Points : 654
    Points
    654
    Par défaut
    3 colonne A,B et C

    Et tu fais dans la colonnes C un rechercheV ensuite tu cache la colonne b

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 36
    Points : 27
    Points
    27
    Par défaut
    Une idée de la formule ?

  7. #7
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 434
    Points : 654
    Points
    654
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    =RECHERCHEV(A1; $B$1:$B$X; 1; FAUX)
    Tu met ça dans C1 et tu tire la cellule sur ttes les cellules que tu veux

  8. #8
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut
    Bonjour kythi,

    voici une méthode simple utilisant un dictionnaire.

    Au préalable dans l'environnement VBA, Microsoft Scripting Runtime doit être coché dans le menu Outils, Références.

    Exemple fonctionnant avec la feuille active, source & résultat à partir de la cellule A1 :
    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
    Sub ArrangeListe()
        Dim Liste As New Dictionary, Cel As Range
        P$ = "A1:B" & Cells(Rows.Count, 1).End(xlUp).Row
     
        For Each Cel In Range(P)
            V = Cel.Value
            If V > "" Then Liste.Item(V) = Liste.Item(V) + 1
        Next
     
        Application.ScreenUpdating = False
        Range(P).ClearContents
     
        For R& = 1 To Liste.Count
            Cells(R, 1) = Liste.Keys(R - 1)
            If Liste.Items(R - 1) > 1 Then Cells(R, 2) = Liste.Keys(R - 1)
        Next
     
        Liste.RemoveAll
        Application.ScreenUpdating = True
    End Sub

    _______________________________________________________________________________

    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  9. #9
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 434
    Points : 654
    Points
    654
    Par défaut
    Bonjour,

    Faire du VBA quand ce n'est pas nécessaire c'est un peu dommage après c'est au choix de chacun

  10. #10
    Invité
    Invité(e)
    Par défaut
    Bonjour, test ça
    Fichiers attachés Fichiers attachés

  11. #11
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut
    Citation Envoyé par jouana Voir le message
    Faire du VBA quand ce n'est pas nécessaire c'est un peu dommage après c'est au choix de chacun
    Entièrement d'accord !

    Mais ta formule ne donnant rien sur ma version et comme Daniel C n'a pas non plus proposé de formule,
    au moins mon code répondait exactement à la problématique exposée, du moins le croyais-je …

    En effet, je n'ai pas vu qu'il fallait conserver la colonne d'origine d'un nom unique.

    Voici donc ma version en tenant compte :
    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 ArrangeListe()
        Dim Liste As New Dictionary, Cel As Range
        R& = Cells(Rows.Count, 1).End(xlUp).Row
        B& = Cells(Rows.Count, 2).End(xlUp).Row
         C = "A1:B" & IIf(B > R, B, R)
     
        For Each Cel In Range(C)
            If Cel.Value > "" Then _
                Liste.Item(Cel.Value) = IIf(Liste.Item(Cel.Value) > "", 2, "1:" & Cel.Column)
        Next
     
        Application.ScreenUpdating = False
        Range(C).ClearContents
     
        For R = 1 To Liste.Count
            C = Split(Liste.Items(R - 1), ":")
     
            If UBound(C) Then
                Cells(R, Val(C(1))) = Liste.Keys(R - 1)
     
            Else
                Cells(R, 1) = Liste.Keys(R - 1)
                Cells(R, 2) = Liste.Keys(R - 1)
            End If
        Next
     
        Liste.RemoveAll
        Application.ScreenUpdating = True
    End Sub
    Rappel : ce code ne fonctionne uniquement si Microsoft Scripting Runtime est bien coché dans les Références du menu Outils,
    depuis la feuille active, source & résultat à partir de la cellule A1.


    Nb : le résultat doit être identique si la procédure est lancée une deuxième fois avec la liste corrigée …


    _______________________________________________________________________________

    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion …


    __________________________________________________________________
    Les bourses ne témoignent pas l'état des économies, mais de la psychologie des investisseurs ! (Françoise Giroud)
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  12. #12
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 434
    Points : 654
    Points
    654
    Par défaut
    Je retire ma réponse j'avais mal lu le sujet :/
    Par contre intéressant je vais fouiller sur le sujet quand j'aurai un peu de tps

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 36
    Points : 27
    Points
    27
    Par défaut
    Et bien, merci d'alimenter le sujet en mon absence

    J'ai donc développé ce dont j'avais besoin.

    Je fais donc une copie de la colonne A et B pour pouvoir travailler dessus.
    Etant donnée que les chaines de caractères A et B peuvent avoir des différences je fais des traitements avant.
    - Je met tout en majuscule
    - je retire les espaces inutile avant et après les nom prénom mais pas entre.
    - je retire les accents

    Ensuite je fais une première passe,
    si le nom est sur la même ligne je le supprime de la colonne B.

    Ensuite je fais une seconde passe en recherche dans la colonne B entière. Et je retire si j'ai trouvé le nom.

    3eme passe, je note les noms restant dans une colonne nom erreurs.


    Merci pour votre aide, même si au final je n'ai pas encore testé votre code.

  14. #14
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 203
    Points : 14 354
    Points
    14 354
    Par défaut
    Bonjour,

    et comme Daniel C n'a pas non plus proposé de formule
    Ben non, la question a été posée dans le forum "Macros et VBA Excel".
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  15. #15
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut
    Bonjour Daniel !

    Loin de moi l'idée de te jeter la pierre mais je me doute dans le cas d'une solution sous le coude via formule directe sans VBA,
    comme d'autres, tu l'aurais signalé !


    ________________________________________________
    Quelle époque terrible que celle où des idiots dirigent des aveugles. (Shakespeare)
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  16. #16
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 203
    Points : 14 354
    Points
    14 354
    Par défaut
    Bonjour Marc-L,

    Franchement, j'ai proposé une solution mais j'étais à côté de la plaque. Comme j'ai vu d'autres propositions (macros ou formules), je ne m'y suis plus investi.
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

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

Discussions similaires

  1. récupérer la liste des noms des champs d'une table
    Par la_didise dans le forum Access
    Réponses: 2
    Dernier message: 29/05/2006, 16h55
  2. obtenir une liste des noms de session d'un ordinateur
    Par Raylemon dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 09/03/2006, 19h12
  3. Comparer des listes de prix
    Par denisfavre dans le forum Access
    Réponses: 8
    Dernier message: 08/11/2005, 20h11
  4. [C#] Liste des noms des jours
    Par Oberown dans le forum C#
    Réponses: 9
    Dernier message: 07/11/2005, 11h38
  5. Comment obtenir la liste des noms des ordinateurs du réseau ?
    Par da_latifa dans le forum Web & réseau
    Réponses: 2
    Dernier message: 17/08/2005, 11h58

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