Comparer 2 feuilles Excel VBA

Norman -  
 Norman -
Bonjour,

Je fais appel à votre savoir, ô spécialistes de VBA.

Voici un problème de bureautique que je n'arrive pas à résoudre.

J'ai une première feuille Excel (FEUILLE1) avec 3 colonnes.

- La colonne 1 (NAME) est une liste d'investisseurs. Elle contient la totalité des investisseurs.
- La colonne 2 (SHARES) est le nombre d'actions. Aucune donnée renseignée dans la colonne.
- La colonne 3 (DATE) est... une date. Aucune donnée renseignée dans la colonne.

Ma seconde feuille (FEUILLE2) contient les mêmes colonnes mais seulement une partie des investisseurs. Ici, les données SHARES et DATE sont renseignées.

La première feuille est la trame utilisée pour l'ensemble des projets, la seconde est un projet. A chaque nouveau projet, j'obtiens la liste des investisseurs concernés.

Mon objectif est de comparer le contenu de NAME dans les 2 feuilles et de réaliser les opérations suivantes dans FEUILLE1 :

1. si NAME est identique*, conserver les lignes et supprimer ou masquer les autres
2. pour chaque ligne conservée, copier les données des colonnes SHARES et DATE
3. si des lignes sont dans FEUILLE2 et pas dans FEUILLE1, les copier dans FEUILLE1

* Les noms des investisseurs pouvant varier, la comparaison se fera sur les 2 premiers mots

Merci de votre aide !

Norman

8 réponses

  1. melanie1324 Messages postés 1561 Statut Membre 156
     
    Bonjour,

    j'aurais pu t'aider mais le problème vient du fait que les noms de tes investisseurs peuvent varier.

    Je peux quand même te proposer une aide si et seulement si :
    les deux premiers mots ont le même nombre de caractères pour tous les investisseurs.

    Si tel n'est pas le cas, je vois pas trop comment faire.
    0
  2. Norman
     
    Bonjour Mélanie,
    Merci pour ta réponse !
    Je te confirme que les 2 premiers mots ont le même nombre de caractères !
    Allez, dis moi que tu peux m'aider ! :)
    Norman
    0
  3. melanie1324 Messages postés 1561 Statut Membre 156
     
    Alors la oui, donne moi le nombre de caractères des deux mots.
    Je te donnerais le code demain matin!!!
    0
  4. melanie1324 Messages postés 1561 Statut Membre 156
     
    De plus, tu dis :

    si NAME est identique*, conserver les lignes et supprimer ou masquer les autres

    dans quelles feuilles figurent-elles et faut il les masque rou les supprimer, les 2 étant faisables?
    0
    1. melanie1324 Messages postés 1561 Statut Membre 156
       
      Conserver quelles lignes : celles de la feuille2 ou de la feuille1?
      Conserver une seule ligne correspondant à un seul investisseur?
      Supprimer ou masquer les autres?
      Ce point n'est pas clair.
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. melanie1324 Messages postés 1561 Statut Membre 156
     
    En attendant tes réponses, voici un premier code.
    enregistres une copie de ton fichier et vois ce que ca donne.
    Pour info, j'ai fixé à 5 caractères les 2 premiers mots, si c'est pas ca, modifies.

    Un conseil appuies sur F8 sur le code pour voir ce que ca fait!!

    Sub x()

    'Permet de supprimer tous les doublons de la feuille 1
    a = 1
    Do While Sheets("Feuil1").Cells(a, 1) <> ""
    valeur = Left(Sheets("Feuil1").Cells(a, 1), 5)
    i = a + 1
    Do While Sheets("Feuil1").Cells(i, 1) <> ""
    If valeur = Left(Sheets("Feuil1").Cells(i, 1), 5) Then ' 5 représente le nombre de caractères de tes deux mots, remplaces par celui que tu souhaites
    Rows(i).Select
    Selection.Delete Shift:=xlUp
    i = i - 1
    End If

    i = i + 1
    Loop
    a = a + 1
    Loop

    i = 1
    Do While Sheets("Feuil2").Cells(i, 1) <> ""
    a = 1
    b = ""
    Do While Sheets("Feuil1").Cells(a, 1) <> ""
    If Left(Sheets("Feuil2").Cells(i, 1), 5) = Left(Sheets("Feuil1").Cells(a, 1), 5) Then ' 5 représente le nombre de caractères de tes deux mots, remplaces par celui que tu souhaites
    Sheets("Feuil1").Cells(a, 2) = Sheets("Feuil2").Cells(i, 2)
    Sheets("Feuil1").Cells(a, 3) = Sheets("Feuil2").Cells(i, 3)
    b = 1
    End If
    a = a + 1
    Loop
    If b = "" Then
    Sheets("Feuil1").Cells(a, 1) = Sheets("Feuil2").Cells(i, 1)
    Sheets("Feuil1").Cells(a, 2) = Sheets("Feuil2").Cells(i, 2)
    Sheets("Feuil1").Cells(a, 3) = Sheets("Feuil2").Cells(i, 3)
    End If
    i = i + 1
    Loop
    End Sub
    0
  7. Norman
     
    Merci beaucoup pour ton aide Mélanie !

    Je vais essayer d'être plus clair, purée c'est pas simple de mettre à l'écrit un problème sur Excel. Si je n'y arrive toujours pas, je pourrais toujours t'envoyer le fichier, ça sera peut-être plus simple.

    Bon allez, j'essaie quand même :)

    J'ai 2 feuilles, FEUILLE1 et FEUILLE2 qui contiennent chacune une liste d'investisseurs dans une colonne qui s'appelle NAME. Ces feuilles contiennent également 2 autres colonnes qui s'appellent SHARES et DATE.

    FEUILLE1 est ma trame et ne contient pas de données dans les colonnes SHARES et DATE, uniquement la liste complète des investisseurs. J'utilise FEUILLE1 car elle contient d'autres colonnes qui me servent pour autre chose.

    FEUILLE2 contient les données qui m'intéressent et n'a que 3 colonnes : les investisseurs concernés dans NAME, le nombre d'actions dans SHARES et une date dans DATE. Je reçois ce document au début de chaque projet

    Pour faire simple, je souhaite intégrer les lignes de FEUILLE2 dans FEUILLE1.

    J'aimerais que ma macro compare les caractères de la colonne NAME des 2 feuilles et masque ou supprime les lignes dans FEUILLE1 qui ne sont pas dans FEUILLE2. Ces investisseurs ne participe pas au projet et ne doivent pas apparaître dans ma feuille.

    Si les X premiers caractères d'une cellule sont similaires, je souhaite copier coller les données des colonnes SHARES et DATE de FEUILLE2 vers FEUILLE1.

    Il peut également arriver que de nouveaux investisseurs viennent s'ajouter à la liste. Dans notre programme cela signifie qu'une chaîne de X caractères dans FEUILLE2 n'existe pas dans FEUILLE1. Dans ce cas je souhaite copier les 3 cellules NAME, SHARES et DATE de FEUILLE2 vers FEUILLE1.

    Voici quelques exemples de ce qu'il peut y avoir dans la colonne NAME :

    MERRILL LYNCH & CO
    MERRILL LYNCH ASSET MGT
    MERRILL LYNCH INVEST CDN
    MERRILL LYNCH INVESTMENT MANAGEMENT (NJ)
    MERRILL LYNCH INVESTMENT MANAGERS (UK) LTD.

    5 caractères serait donc trop juste, j'ai fait le tour de la liste et 20 caractères fonctionne. J'espère que les espaces ne posent pas de problème.

    Voila, j'espère avoir répondu à tes questions, n'hésite pas si tu as le moindre doute.

    Et merci encore!

    Norman
    0
  8. melanie1324 Messages postés 1561 Statut Membre 156
     
    essaie avec ca :

    Sub x()
    'permet de renseigner les colonnes de tes investisseurs

    i = 1
    Do While Sheets("Feuil2").Cells(i, 1) <> ""
    a = 1
    b = ""
    Do While Sheets("Feuil1").Cells(a, 1) <> ""
    If Left(Sheets("Feuil2").Cells(i, 1), 20) = Left(Sheets("Feuil1").Cells(a, 1), 5) Then ' 5 représente le nombre de caractères de tes deux mots, remplaces par celui que tu souhaites
    Sheets("Feuil1").Cells(a, 2) = Sheets("Feuil2").Cells(i, 2)
    Sheets("Feuil1").Cells(a, 3) = Sheets("Feuil2").Cells(i, 3)
    Sheets("Feuil1").Cells(a, 58) = "X"
    b = 1
    End If
    a = a + 1
    Loop
    If b = "" Then
    Sheets("Feuil1").Cells(a, 1) = Sheets("Feuil2").Cells(i, 1)
    Sheets("Feuil1").Cells(a, 2) = Sheets("Feuil2").Cells(i, 2)
    Sheets("Feuil1").Cells(a, 3) = Sheets("Feuil2").Cells(i, 3)
    Sheets("Feuil1").Cells(a, 58) = "X"
    End If
    i = i + 1
    Loop

    'Permet de supprimer les investisseurs qui ne figurent pas dans feuil2 :

    i = 1
    Do While Sheets("Feuil1").Cells(i, 1) <> ""
    If Sheets("Feuil1").Cells(i, 58) <> "X" Then
    Sheets("Feuil1").Select
    Rows(i).Select
    Selection.Delete Shift:=xlUp
    Else
    Sheets("Feuil1").Cells(i, 58) = ""
    End If
    i = i + 1
    Loop
    End Sub
    0
  9. Norman
     
    Bonjour Mélanie,

    Merci beaucoup pour ton code ! Ça marche ! :)

    La copie fonctionne bien, par contre je dois lancer la macro 5 ou 6 fois pour que tous les doublons soient supprimés. Peut-être un problème dans la boucle?

    2 nouvelles questions :

    - Est-il possible de masquer les lignes plutôt que de les supprimer?

    - Dans le cas où des nouveaux investisseurs sont dans la FEUILLE2 et pas dans la FEUILLE1 (dans notre programme cela signifie qu'une chaîne de X caractères dans FEUILLE2 n'existe pas dans FEUILLE1), je souhaiterais insérer une ligne et copier les 3 cellules NAME, SHARES et DATE de FEUILLE2 vers FEUILLE1.

    Tiens moi au courant quand tu as un moment pour regarder ça !

    Et merci encore
    0