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é)
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
Fichier 2
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 ...