Comparaison de deux cfeuilles Excel
P
Bonjour,
Tout d'abord un grand merci pour vos aides et vos réponses très détaillées. Je vous suis très reconnaissant pour ce que vous avez fait. J'aurai une dernière question concernant ton code h2so4:
Pourquoi seules les premières lignes affichent la ligne à laquelle une différence est trouvée? Est-il possible d'afficher toutes les lignes des erreurs trouvées par la macro?
Très cordialement
bonjour,
ajout du numéro de ligne pour les lignes présentes dans un fichier et absentes dans l'autre.
Option Explicit
Private Sub cmdAnalyse_Click()
Dim strRepFicA As String, strRepFicB As String
Dim wbFicA As Workbook, wbFicB As Workbook, wbFicAna As Workbook
Dim wsFicA As Worksheet, wsFicB As Worksheet, wsFicAna As Worksheet
Dim lgLig As Long, lgCol As Long, lgLigB As Long, lgColB As Long
Dim lgLigDeb As Long
Dim dicoA, dicoB
Dim key
Dim dla, dlb
' Répertoire et Fichier
strRepFicA = Application.GetOpenFilename
strRepFicB = Application.GetOpenFilename
' Classeur d'analyse
Set wbFicAna = ThisWorkbook
Set wsFicAna = wbFicAna.ActiveSheet
' Vérifier que les fichiers A et B se trouvent dans le répertoire
If Dir(strRepFicA) = "" Or Dir(strRepFicB) = "" Then
MsgBox "Le fichier A et/ou le fichier B sont introuvables", vbCritical + vbOKOnly, "Problème de fichiers..."
Exit Sub
End If
Application.ScreenUpdating = False
' Ouverture du fichier A et définition de la feuille de traitement
Set wbFicA = Workbooks.Open(Filename:=strRepFicA)
Set wsFicA = wbFicA.Worksheets("A")
' Ouverture du fichier B et définition de la feuille de traitement
Set wbFicB = Workbooks.Open(Filename:=strRepFicB)
Set wsFicB = wbFicB.Worksheets("A")
' Vider les lignes du fichier d'analyse
wsFicAna.Range("A2:BN" & Cells.Rows.Count).ClearContents
' Première ligne d'affichage des résultats dans le fichier d'analyse
lgLigDeb = 10 - 1
' Traitement des lignes des 2 fichiers
Set dicoA = CreateObject("scripting.dictionary")
Set dicoB = CreateObject("scripting.dictionary")
' on crée une entrée dans le dictionnaire pour chaque ligne unique de B
dla = wsFicA.Cells(Rows.Count, 1).End(xlUp).Row
dlb = wsFicB.Cells(Rows.Count, 1).End(xlUp).Row
For lgLig = 2 To dlb
' on construit la clé du dictionnaire en faisant parcourir à la boucle toutes les colonnes du 2eme fichier de A à BN
key = ""
For lgCol = 1 To 67
key = key & wsFicB.Cells(lgLig, lgCol)
Next lgCol
' si la clé n'existe pas on la sauve
If key <> "" Then
If Not dicoB.exists(key) Then
dicoB.Add key, lgLig
Else 'doublon détecté dans B
lgLigDeb = lgLigDeb + 1
lgLigB = dicoB.Item(key)
wsFicAna.Range("A" & lgLigDeb).Value = wbFicB.Name & " ligne " & lgLigB & "/" & lgLig
' Copier la ligne du fichier B dans le fichier d'analyse
wsFicB.Range("A" & lgLigB & ":" & "BO" & lgLigB).Copy
wsFicAna.Range("B" & lgLigDeb).PasteSpecial xlPasteValues
End If
End If
Next lgLig
' on crée une entrée dans le dictionnaire pour chaque ligne unique de A
' on regarde si la ligne existe dans B, via le dictionnaire B
For lgLig = 2 To dla
' on construit la clé du dictionnaire en faisant parcourir à la boucle toutes les colonnes du 1er fichier de A à BN
key = ""
For lgCol = 1 To 67
key = key & wsFicA.Cells(lgLig, lgCol)
Next lgCol
If key <> "" Then
If Not dicoA.exists(key) Then
dicoA.Add key, lgLig
Else 'doublon détecté dans A
lgLigDeb = lgLigDeb + 1
lgLigB = dicoA.Item(key)
wsFicAna.Range("A" & lgLigDeb).Value = wbFicA.Name & " ligne " & lgLigB & "/" & lgLig
' Copier la ligne du fichier B dans le fichier d'analyse
wsFicA.Range("A" & lgLigB & ":" & "BO" & lgLigB).Copy
wsFicAna.Range("B" & lgLigDeb).PasteSpecial xlPasteValues
End If
If Not dicoB.exists(key) Then 'ligne de A n'existe pas dans B
lgLigDeb = lgLigDeb + 1
wsFicAna.Range("A" & lgLigDeb).Value = wbFicA.Name & " ligne " & lgLig
' Copier la ligne du fichier A dans le fichier d'analyse
wsFicA.Range("A" & lgLig & ":" & "BO" & lgLig).Copy
wsFicAna.Range("B" & lgLigDeb).PasteSpecial xlPasteValues
End If
End If
Next lgLig
For Each key In dicoB.keys 'on vérifie si les lignes de B existent dans A via le dictionnaire
If Not dicoA.exists(key) Then 'ligne de B n'existe pas dans A
' Affichage du nom du fichier en colonne A
lgLigDeb = lgLigDeb + 1
wsFicAna.Range("A" & lgLigDeb).Value = wbFicB.Name & " ligne " & dicoB.Item(key)
' Copier la ligne du fichier B dans le fichier d'analyse
lgLigB = dicoB.Item(key)
wsFicB.Range("A" & lgLigB & ":" & "BO" & lgLigB).Copy
wsFicAna.Range("B" & lgLigDeb).PasteSpecial xlPasteValues
End If
Next key
' Fermer les fichiers A et B
wbFicA.Close savechanges:=False
wbFicB.Close savechanges:=False
MsgBox "Traitement terminé"
Application.ScreenUpdating = True
End SubP
C'est parfait! je te remercie énormément pour le temps que tu as passé sur cette macro.
Bien cordialement