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 deux fichiers Excel


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 15
    Par défaut comparer deux fichiers excel
    Bonjour,

    je suis débutant en vba et je voudrais réaliser un programme qui me permettrais de comparer deux fichiers excel ligne par ligne. Je dispose d'un fichier mis à jour tout les 10 jours. La feuille dans le fichier nouveau contient une catégorie de clientéle :
    -en colonne les intitulés: nom du cleint, code interne, la prestation , le responsable.
    - en ligne: le détail

    Un client ( et donc son code) peut se trouver plusieurs fois dans la feuille vu qu'il peut y avoir plusieurs prestations ou plusiers responsables.

    j'ai fait la macro suivante mais je ne sais pas qu'est ce qui ne va pas; quelqu'un pourrait svp, je lui serais trés reconnaissant:

    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
    Sub galopin()
    Dim iLRA%, iLRN%, i%, j%, k%
    Dim Y As Boolean, Ys As Boolean, Yr As Boolean
    Dim TabloA(), TabloN(), TabloB(), TabloC()
    Dim WbA As Workbook, WbN As Workbook
    Dim WsA As Worksheet, WsN As Worksheet
    'Détermination du nombre de ligne de Classeur "Ancien" et "Nouveau"
    Set WbA = Workbooks("OPTIM BASE CLIENTS 26 décembre 2008.xls")
    Set WbN = Workbooks("OPTIM BASE CLIENTS 20 février 2009.xls")
    Set WsA = WbA.Worksheets(1)
    Set WsN = WbN.Worksheets(1)
    iLRA = WsA.Cells(65535, 1).End(xlUp).Row
    iLRB = WsN.Cells(65535, 1).End(xlUp).Row
    TabloA() = WsA.Range("A1:A" & iLRA)
    TabloN() = WsN.Range("A1:A" & iLRB)
    TabloB() = WsB.Range("E1:E" & iLRA)
    TabloC() = WsC.Range("E1:E" & iLRB)
    'Détermination des absents
    For i = 1 To UBound(TabloA)
         For j = 1 To UBound(TabloN) 'Si égalité alors on pose un drapeau
             If TabloN(j, 1) = TabloA(i, 1) Then
             Y = True
                For s = 1 To UBound(TabloB)
                For u = 1 To UBound(TabloC)
                    If TabloB(s, 1) = TabloC(u, 1) Then
                    Yr = True
          'et on vérifie la ligne si c'est une égalité stricte
                    For k = 1 To 15
     
                       If WsA.Cells(i, k) <> WsN.Cells(j, k) Then 'si différence on pose un drapeau
                           If WsA.Cells(s, k) <> WsN.Cells(u, k) Then
                           Ys = True
                           WsN.Cells(j, k).Interior.ColorIndex = 45 'et on colorie en orange
                           End If
                       End If
                       Next
                       WsN.Cells(u, 1).Interior.ColorIndex = IIf(Ys, 45, 4)  'sinon 1ere cellule en vert
                       Ys = False
                       Exit For
                    End If
                    Next
                WsN.Cells(u, 1).Interior.ColorIndex = IIf(Yr, 46, 4)
                Yr = False
                Exit For
      End If
      'Si pas trouvé alors on colorie en rouge
             If Not Y Then WsA.Range("A" & i).Interior.ColorIndex = 3
             Y = False
    Next
    Set WbA = Nothing
    Set WbN = Nothing
    Set WsA = Nothing
    Set WsN = Nothing
    End Sub
    merci

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Bonjour ptalal, bienvenue sur le forum.
    Pour moi, à première vue et sans avoir le temps de creuser plus loin, tu as déjà deux corrections à apporter pour que tes tableaux, de type Variant, soient renseignés :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim TabloA, TabloN, TabloB, TabloC
     
    TabloA = WsA.Range("A1:A" & iLRA).value
    TabloN = WsN.Range("A1:A" & iLRB).value
    TabloB = WsB.Range("E1:E" & iLRA).value
    TabloC = WsC.Range("E1:E" & iLRB).value
    Pour tester :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub test()
    Dim TabloA as variant
    Dim WbA As Workbook
    Dim WsA As Worksheet
        Set WbA = Workbooks("OPTIM BASE CLIENTS 26 décembre 2008.xls")
        Set WsA = WbA.Worksheets(1)
        iLRA = WsA.Cells(65535, 1).End(xlUp).Row
        TabloA = WsA.Range("A1:A" & iLRA).Value
     
        For i = 1 To UBound(TabloA)
            MsgBox TabloA(i, 1) 'où 1 est le N° de colonne dans un tableau n'en comportant qu'une
        Next
    Bon week-end

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 15
    Par défaut
    En fait comme mes deux fichiers disposent de plusieurs milliers de lignes un peu difficiles d'utiliser le msg box. c'est pour j'ai juste essayé de colorier les données qui ne sont pas identiques. dans un deuximée temps je vais essayer de les extraire dans un nouveau fichier (mais ca c pour plus tard!!! lol). y a-t-il d'autres solutions peut etre??

  4. #4
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Tu as bien compris que le msgbox n'est là que pour afficher ce que tu obtiens mais tu peux le remplacer par le code adéquat.

    Comme j'ai vu que tu as ouvert une nouvelle discussion sur le même sujet, je fusionne les deux. Et reste sur cette discussion.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 15
    Par défaut Comparer deux fichiers Excel
    Bonjour,

    j'aurais besoin de vos précieuses aides vu que je suis encore débutant en vba.
    j'ai deux fichiers (avec une seul feuille) que je dois comparer (ligne par ligne) et extraire les lignes qui sont différentes dans un nouveau fichier excel.

    Les données dans le fichiers sont exposés de la maniére suivante:

    ColonA ColonB ColonC ColonD ColonE

    Li1 nom codeclient service codeprestation responsable
    Li2 DUPOND 01 luxe 128 mathieu
    Li3 Durant 04 moyen 198 rémy
    Li4 FOssard 09 luxe 265 mathieu
    Li4 FOssard 09 médiocre 897 mathieu
    Li5 NAKI 12 moyen 465 mathilde


    (le code prestation est unique par client et service).
    Le deuxiéme fichier contient les memes données (la meme structure) avec des clients en plus et des clients en moins et des clients qui étaient déjà dans le premier fichier mais qui sont ouscrit à de nouveau service.

    ce que je souhaite faire est:
    - d'extraire les lignes des clients qui n'existe plus dans le nouveau fichier,
    - d'extraire les nouveaux clients
    - d'extraire les clients existants dans l'ancien base et qui ont souscrit à de nouveau service.

    ca serait bien si les extractions soit faites dans des feuilles séparés dans un nouveau fichier.

    est ce qu'une âme charitable aurait la gentillesse de m'aider sur ce casse tête?? je vous rtemercie par avance!!!!

  6. #6
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    J'ai donc fusionné les deux discussions.
    Ici tu exposes plus clairement ton pb.

    Le problème est que tu as des "exigences" contradictoires.
    1 - Tu veux extraire les lignes des clients qui n'existe plus dans le nouveau fichier.
    Tu comprends bien que pour trouver les clients qui n'existe plus tu dois partir du fichier contenant ces clients pour vérifier dans le nouveau fichier s'ils existent toujours.
    Donc la procédure lit Fichier1 et recherche dans Fichier2.

    2 - Tu veux extraire les nouveaux clients, donc dans fichier2. Pour réaliser cette extraction, tu dois partir du fichier contenant ces clients pour vérifier qu'il n'existent pas dans Fichier1.
    Donc, la procédure lit Fichier2 et recherche dans fichier1.

    3 - Tu veux extraire les clients existants dans l'ancien base et qui ont souscrit à de nouveau service.
    Donc la procédure lit Fichier1 et recherche dans Fichier2 si le client existe toujours.
    On revient donc au premier cas et que tu peux les traiter simultanément.

    Pour le principe, dans le premier et troisième cas :
    On parcourt ligne par ligne la colonne 1 de fichier1 et on recherche le nom dans fichier2
    Si le nom est trouvé, on vérifie le prénom.
    Si les deux correspondent on stocke le nom du client dans la feuille "Le_client_il_est_toujours_là" et on passe à la ligne suivante du fichier1.
    S'il n'est pas trouvé, on stocke le nom du client dans la feuille "Le_client_il_est_plus_là" et on passe à la ligne suivante du fichier1
    J'ai dit "pour le principe".
    Ce que je ferais et que je t'ai proposé, serait d'utiliser la plage de données sous forme de tableau à deux dimensions et, au lieu de parcourir les lignes de fichier1 pour trouver nom et prénom dans fichier 2, je parcourrais le tableau, ce qui est beaucoup plus rapide.

    Tu dis ce que tu ne comprends pas.
    A+

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 15
    Par défaut
    merci pour la réponse et pour la fucion aussi...

    Je vais expliquer ce que t'appelle des "exigences" contradictoires parce que je me suis peut etre mal exprimés dans mon dernier message. appelons d'abord le fichier qui contient les nouvelles données "fichier N" et celui qui contient les anciennes "fichier A".

    1- extraire du "fichier A" les lignes qui sont dans ce fichier et qui ne le sont plus dans le fichier N.

    2- extraire du "fichier N" les lignes qui sont dans ce fichier et ne les étaient pas dans le "fichier A".

    3- comme illustré dans mon exemple, un client peut exister dans deux ou plusieurs lignes vu qu'il peut avoir plusieurs services. l'objectif est d'extraire du "fichier N" les clients qui existaient bien dans le "fichier A" mais qui ont souscris à de nouveaux services.

    Par contre j'ai pas compris ton idée "d'utiliser la plage de données sous forme de tableau à deux dimensions et, au lieu de parcourir les lignes de fichier1 pour trouver nom et prénom dans fichier 2, je parcourrais le tableau, ce qui est beaucoup plus rapide".

    je fais du vba depuis moins de deux semaines dc tu peux bien imaginer la monstruausité de ce projet pour moi.

    merci pour ta compréhension.

    A+

  8. #8
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Comme la question est récurrente, j'ai donnée une méthode ici qui permet de faire ce que tu demandes. Bien sûr, il te restera à l'adapter.
    Je pense que tu souhaiteras supprimer les doublons pour les noms qui apparaissent plusieurs fois... Tu as deux méthodes, l'une consistant à vérifier, feuil3 (celle où tu copies les noms) au fure et à mesure, l'autre méthode réalisant la suppression des doublons une fois les copies réalisées. Et là tu as le code dans la FAQ.
    Je ne pense pas qu'une méthode soit plus rapide que l'autre dans ce contexte.
    Bon courage puisque tu débutes mais n'hésite pas à poser des questions si tu ne comprends pas.

    Edit
    Une autre méthode pour éviter les doublons : Les masquer dans la feuille d'origine. Tu trouveras la méthode ici

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 15
    Par défaut
    bonjour,

    je sais que c'est vendredi aprés-midi et que tt le monde veut partir en wk end, mais je compte toujours sur vous pr résoudre mes problémes.

    je te remrcie bcp ouskel'n'orpr tes efforts.

    voila je suis arrivé à faire ce code (une tte premiére étape)qui permet de colorier en rouge les lignes qui sont dans le fichier ancien mais pas dans le fichier nouveau. ca marche super bien. t'aurais peut etre une idée sur la facon dont je pourrais copier /coller ces données pr les mettre ds un nouveau fichier??

    voila 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
    41
    Sub Tarik()
    Dim iLRA%, iLRN%, i%, j%, k%
    Dim Y As Boolean, Ys As Boolean
    Dim TabloA(), TabloN()
    Dim WbA As Workbook, WbN As Workbook
    Dim WsA As Worksheet, WsN As Worksheet
    'Détermination du nombre de ligne de Classeur "Ancien" et "Nouveau"
    Set WbA = Workbooks("feuil Ancien.xls")
    Set WbN = Workbooks("feuil Nouveau.xls")
    Set WsA = WbA.Worksheets(1)
    Set WsN = WbN.Worksheets(1)
    iLRA = WsA.Cells(65535, 1).End(xlUp).Row
    iLRB = WsN.Cells(65535, 1).End(xlUp).Row
    TabloA() = WsA.Range("A1:A" & iLRA)
    TabloN() = WsN.Range("A1:A" & iLRB)
    'Détermination des absents
    For i = 1 To UBound(TabloA)
      For j = 1 To UBound(TabloN)
        'Si égalité alors on pose un drapeau
        If TabloN(j, 1) = TabloA(i, 1) Then
          Y = True
          'et on vérifie la ligne si c'est une égalité stricte
            For k = 1 To 15
              'si différence on pose un drapeau
              If WsA.Cells(i, k) <> WsN.Cells(j, k) Then
                Ys = True
              End If
            Next
            Ys = False
          Exit For
        End If
      Next
      'Si pas trouvé alors on colorie en rouge
      If Not Y Then WsA.Range("A" & i).Interior.ColorIndex = 3
      Y = False
    Next
    Set WbA = Nothing
    Set WbN = Nothing
    Set WsA = Nothing
    Set WsN = Nothing
    End Sub

Discussions similaires

  1. [XL-2003] Comparer deux fichiers excel
    Par dybmans dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 05/02/2014, 09h46
  2. Comparer deux fichiers excel
    Par miss-o-21 dans le forum Excel
    Réponses: 6
    Dernier message: 12/07/2011, 17h30
  3. [XL-2007] Comparer deux fichiers excels
    Par douzoumka dans le forum Excel
    Réponses: 2
    Dernier message: 20/10/2009, 11h12
  4. [VB]Problème ouverture de deux fichier excel
    Par Yanmeunier dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 17/02/2006, 15h51
  5. Fonction c qui compare deux fichiers ???
    Par babyface dans le forum C
    Réponses: 4
    Dernier message: 19/11/2005, 13h07

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