Comparaison de 2 fichiers Excel et résultat dans un fichier 3

Bonjour à tous,

Etant super débutante en VBA, J'ai créé une macro et je sollicite votre aide à tous svp.

Je m'explique,

Ma macro doit normalement comparer les données d'un fichier 1 avec les données d'un fichier 2 voir PJ. Par la suite, la macro affiche une analyse dans le fichier 3 :

  • si elle a trouvé les données du fichier 1 dans le fichier 2 mais qu'elles sont différentes (elle affiche une copie des lignes correspondantes des fichiers en question)
  • si elle n'a pas trouvé la donnée dans le fichier 1 (elle affiche juste les données en précisant le statut non trouvé)
Par la suite, elle affiche sur une colonne dans le fichier 3 l’écart entre les 2 fichiers en fusionnant les cellules

Problème:

Pour réaliser cela j'ai créé une macro qui prend la valeur de chaque cellule de la première colonne du fichier 1 et va les chercher dans le fichier 2. Je devrais en principe avoir ce que j'ai expliqué ci-dessus, mais il se trouve que ma macro n'affiche aucun résultat, pourtant les fichiers sont bien différents. C'est là que j'ai vraiment besoin de votre aide à tous, car j'ai dû faire une erreur que je n'arrive pas à voir.

J’ai plusieurs fichiers à comparer dans ce style et vos solutions aussi efficaces et simples qu'elles soient sont les bienvenues.

Par ailleurs:

Je ne m'y connais pas du tout en Userform et j'aurai aimé en avoir au tout début afin de pouvoir choisir les fichiers à comparer dans un répertoire et ne pas juste se limiter à ceux-ci.

Fichier 1

14efvsin1avm.xlsx (21.51 Ko)

Fichier 2

13efvsin2apm.xlsx (22.97 Ko)

Fichier d’analyse

Merci beaucoup par avance pour votre aide.

Chavely

Bonjour

en ouvrant tes fichiers, je ne vois aucune macro !

Est ce normal ?

Bonjour jeb,

La macro est dans le fichier 3 (fichier d'analyse). il est visible normalement en cliquant sur "visualiser le code" dans Développeur.

Bonjour

quelques éléments de réponse, je ne peux pas y passer bcp de temps

1. la fonction Application.GetOpenFilename te permet d'ouvrir la boite de dialogue d'ouverture de fichier. tu peux ainsi récupérer tes deux fichiers et instancier un ws1 et ws2 Worksheet object

2. la structure de tes fichiers est-elle toujours la même ou change-t-elle ? Dans la première alternative, définit le range de cellule à tester, ce sera le même pour les deux fichiers (rg as Range); Dans le second cas, utilise InputBox pour définir tes deux ranges à comparer (rg1,rg2 et rg3 as Range pour chacun des trois fichiers)

3. Une bonne pratique est de vérifier la taille de tes ranges avec une gestion d'erreur

4. Ensuite il te suffit de faire une boucle sur l'ensemble du range pour calculer la différence entre tes deux rg3.offset(iL,iC).value=rg1.offset(iL,iC).value-rg2.offset(iL,iC).value

5. Tu peux ensuite, si ton fichier est trop grand, faire une mise en forme conditionnelle pour rapidement voir les cellules dont la valeur est différentes de 0

Amicalement

Merci Jeb pour ta réponse,

Mais comme j'ai dit plus haut je débute sur Excel, et après avoir passer beaucoup de temps sur cette macro j'ai besoin d'aide. Tes explications sont assez compliqués pour mon niveau.

Bonjour,

Face à un objectif final de la nature que tu décris ...et compte tenu du fait que tu es Super Débutante ...

Il y a une règle d'Or à respecter impérativement ... : saucissonner ....

Donc, il faut y aller pas à pas ... en traitant totalement chaque problème séparément ... l'un après l'autre ...

Par conséquent ... quel est le tout premier problème à régler ...???

bonjour james007,

Merci de ta réponse.

D'accord je vais saucissonner.

Mon tout premier problème, c'est de pouvoir avoir une macro permettant de comparer mes 2 fichiers selon l'année et afficher dans mon 3ème fichier les lignes correspondantes aux 2 fichiers que la macro a trouvé différent dans le style

fichier 1 1997 1 2 3 4

fichier 2 1997 2 2 3 4

Re,

J'essaye de bien comprendre ...

que la macro a trouvé différent dans le style :

fichier 1 1997 1 2 3 4

fichier 2 1997 2 2 3 4

Que signifie l'expression que tu utilises' différent dans le style ' .... surtout lorsque tu choisis comme illustration une série de chiffres identiques ... sauf 1 et 2 après 1997 ...???

En fait mon illustration est tirée de la structure de mon fichier 1 et 2

fichier 1

Année c e s total général

1997 0 2 0 0 2

1999 0 112 0 10 122

fichier 2

Année c e s total général

1997 0 2 4 0 6

1999 0 112 0 10 122

J'aimerai que ma macro parcoure le fichier 1 par année, et aille chercher la ligne correspondante à l'année dans le fichier 2. Une fois trouvé, la macro compare les 2 lignes et si elles sont différentes, affiche dans un troisième fichier les 2 lignes (différentes) en question.

fichier 3

Année c e s total général

fichier 1 1997 2 0 0 2

fichier 2 1997 2 4 0 6

J'espère avoir été un peu plus claire.

Bonjour,

Est-ce-que ta macro Analyse fonctionne comme tu le souhaites ... ou pas ...?

Salut

voici un code qui fonctionne (en tout cas chez moi)

J'espère que les commentaires t'aideront

Amicalement

Jeb

Option Explicit

Private Sub cmdAnalyse_Click()

'les trois plages

Dim rng1, rng2, rng3 As Range

'la feuille d'analyse

Dim ws3 As Worksheet

Set ws3 = ActiveWorkbook.ActiveSheet

'ouverture du premier fichier et récupération de la plage

Workbooks.Open Application.GetOpenFilename

Set rng1 = Application.InputBox("Donner le champ à comparer fichier 1", "Entrée", Type:=8)

'ouverture du second fichier et récupération de la plage

Workbooks.Open Application.GetOpenFilename

Set rng2 = Application.InputBox("Donner le champ à comparer fichier 1", "Entrée", Type:=8)

'simple vérification que les deux plages ont le même nb de colonnes

If (rng1.Columns.Count <> rng2.Columns.Count) Then

Dim ret As Integer

ret = MsgBox("les deux plages n'ont pas le même nombre de colonnes", vbCritical)

Exit Sub

End If

'indication de la cellule ou les comparaisons vont être faites

ws3.Activate

Set rng3 = Application.InputBox("Positionner l'emplacement de la première comparaison", "Entrée", Type:=8)

'indice de lignes et colonnes pour parcourir la plage 1 et nombre de colonnes dans les plages 1 et 2

Dim iL, iC, nbC As Integer

nbC = rng1.Columns.Count

'indice de positionnement dans le fichier analyse

Dim cursor As Integer

'la fonction Find renvoie un cellule

Dim aFind As Range

'on va naviguer sur toutes les lignes de la plage 1

For iL = 1 To (rng1.Rows.Count)

'on récupère la valeur de l'année (colonne 1 et ligne iL)

Dim aYear As Integer

aYear = rng1.Cells(iL, 1).Value

'on cherche l'adresse dans plage 2 de la valeur de l'année obtenue dans plage 1. Si elle n'existe pas on passe à la ligne suivante de plage 1

Set aFind = rng2.Find(aYear)

If (aFind Is Nothing) Then

GoTo next1

End If

'on compare les cellules de plage 1 ligne iL et celles de plage 2 ligne aFind.row

For iC = 1 To nbC

'si une différence apparait, on recopie les cellules de plage 1 ligne iL et celles de plage 2 ligne aFind.Address

'on implémente le cursor

If (rng1.Cells(iL, iC).Value <> Workbooks(rng2.Parent.Parent.Name).Worksheets(rng2.Parent.Name).Range(aFind.Address).Offset(0, iC - 1).Value) Then

Dim iiC As Integer

For iiC = 1 To nbC

Workbooks(rng3.Parent.Parent.Name).Worksheets(rng3.Parent.Name).Range(rng3.Address).Offset(cursor, iiC - 1).Value = rng1.Cells(iL, iiC).Value

Workbooks(rng3.Parent.Parent.Name).Worksheets(rng3.Parent.Name).Range(rng3.Address).Offset(cursor + 1, iiC - 1).Value = Workbooks(rng2.Parent.Parent.Name).Worksheets(rng2.Parent.Name).Range(aFind.Address).Offset(0, iiC - 1).Value

Next iiC

cursor = cursor + 2

GoTo next1

End If

Next iC

next1:

Next iL

Workbooks(rng1.Parent.Parent.Name).Close savechanges:=False

Workbooks(rng2.Parent.Parent.Name).Close savechanges:=False

'nettoyage

Set rng1 = Nothing

Set rng2 = Nothing

Set rng3 = Nothing

Set ws3 = Nothing

MsgBox "Traitement terminé"

Application.ScreenUpdating = True

End Sub

Voici un code qui fonctionne

je viens de comprendre comment l'intégrer dans le forum, d'où une réponse dupliquée

Jeb

Private Sub cmdAnalyse_Click()
'les trois plages
    Dim rng1, rng2, rng3 As Range
'la feuille d'analyse
    Dim ws3 As Worksheet
    Set ws3 = ActiveWorkbook.ActiveSheet
    'Set rng1 = Workbooks("EFVSIN1AVM.xlsx").ActiveSheet.Range("B11:G30")
    'Set rng2 = Workbooks("EFVSIN2APM.xlsx").ActiveSheet.Range("B11:G30")
    'Set rng3 = Workbooks("Fichier d'analyse1.xlsm").Worksheets(1).Range("B4:B4")
'ouverture du premier fichier et récupération de la plage
    Workbooks.Open Application.GetOpenFilename
    Set rng1 = Application.InputBox("Donner le champ à comparer fichier 1", "Entrée", Type:=8)
'ouverture du second fichier et récupération de la plage
    Workbooks.Open Application.GetOpenFilename
    Set rng2 = Application.InputBox("Donner le champ à comparer fichier 1", "Entrée", Type:=8)
'simple vérification que les deux plages ont le même nb de colonnes
    If (rng1.Columns.Count <> rng2.Columns.Count) Then
        Dim ret As Integer
        ret = MsgBox("les deux plages n'ont pas le même nombre de colonnes", vbCritical)
        Exit Sub
    End If
'indication de la cellule ou les comparaisons vont être faites
    ws3.Activate
    Set rng3 = Application.InputBox("Positionner l'emplacement de la première comparaison", "Entrée", Type:=8)
'indice de lignes et colonnes pour parcourir la plage 1 et nombre de colonnes dans les plages 1 et 2
    Dim iL, iC, nbC As Integer
    nbC = rng1.Columns.Count
    Debug.Print rng1.Address, rng2.Address, rng3.Address
'indice de positionnement dans le fichier analyse
    Dim cursor As Integer
'la fonction Find renvoie un cellule
    Dim aFind As Range
'on va naviguer sur toutes les lignes de la plage 1
    For iL = 1 To (rng1.Rows.Count)
'on récupère la valeur de l'année (colonne 1 et ligne iL)
        Dim aYear As Integer
        aYear = rng1.Cells(iL, 1).Value
'on cherche l'adresse dans plage 2 de la valeur de l'année obtenue dans plage 1. Si elle n'existe pas on passe à la ligne suivante de plage 1
        Debug.Print aYear
        Set aFind = rng2.Find(aYear)
        If (aFind Is Nothing) Then
            GoTo next1
        End If
        Debug.Print aFind.Address
'on compare les cellules de plage 1 ligne iL et celles de plage 2 ligne aFind.row
        For iC = 1 To nbC
'si une différence apparait, on recopie les cellules de plage 1 ligne iL et celles de plage 2 ligne aFind.row
'on implémente le cursor
            If (rng1.Cells(iL, iC).Value <> Workbooks(rng2.Parent.Parent.Name).Worksheets(rng2.Parent.Name).Range(aFind.Address).Offset(0, iC - 1).Value) Then
                Dim iiC As Integer
                For iiC = 1 To nbC
                    Workbooks(rng3.Parent.Parent.Name).Worksheets(rng3.Parent.Name).Range(rng3.Address).Offset(cursor, iiC - 1).Value = rng1.Cells(iL, iiC).Value
                    Workbooks(rng3.Parent.Parent.Name).Worksheets(rng3.Parent.Name).Range(rng3.Address).Offset(cursor + 1, iiC - 1).Value = Workbooks(rng2.Parent.Parent.Name).Worksheets(rng2.Parent.Name).Range(aFind.Address).Offset(0, iiC - 1).Value
                Next iiC
                cursor = cursor + 2
                GoTo next1
            End If
        Next iC
next1:
    Next iL
    Workbooks(rng1.Parent.Parent.Name).Close savechanges:=False
    Workbooks(rng2.Parent.Parent.Name).Close savechanges:=False
'nettoyage
    Set rng1 = Nothing
    Set rng2 = Nothing
    Set rng3 = Nothing
    Set ws3 = Nothing
    MsgBox "Traitement terminé"
    Application.ScreenUpdating = True
End Sub

 

Bonjour,

J'espère que tu n'es pas découragée ... dès le début ...

Rechercher des sujets similaires à "comparaison fichiers resultat fichier"