Comparer deux classeurs et faire ressortir les differences

Bonjour a tous,

je me permets de solliciter votre aide une seconde fois pour élucider un problème de vbA.

Pour vous situer le contexte je travaille chaque mois sur un fichier comprenant une vingtaine d'onglets, un onglet = un projet. Je souhaiterais mettre en place une macro qui me permettrait de comparer les donnes entre les mois. Par exemple j'aimerais comparer les données du mois de Juin pour chaque projet avec celles de Mai pour chaque projet, afin de voir toutes les lignes qui ont évolué .

Dans mes deux classeurs les onglets qui correspondent aux différents projets ont les memes noms, dans la mesure ou les noms des projets n'évoluent pas. Ci-joint un exemple simplifié des fichiers sur lesquels je travaille.

Je commençais a travailler sur la macro suivante qui me permet de comparer une feuille d'un classeur avec une feuille d'un autre, cependant j'aimerai l'automatiser pour résoudre mon problème ci-dessus et que la macro compare le budget X de Mai avec le budget X de Juin, le budget Y de Mai avec le budget Y de Juin et ainsi de suite dans la mesure ou les onglets ont les memes noms. Est-ce que vous auriez des suggestions ? Encore une fois merci d'avance a tous ceux qui prendront du temps pour m'aider !

Sub test() 
    Dim a, i As Long, ii As Long, w(), b(), n As Long, y, z As String 
    With Workbooks("test.xls").Sheets(1) 
        a = .Range("a1", .Range("a" & Rows.Count).End(xlUp)).Resize(,9).Value 
    End With 
    With CreateObject("Scripting.Dictionary") 
        .CompareMOde = vbTextCompare 
        For i = 2 To UBound(a,1) 
            If Not IsEmpty(a(i,1)) Then 
                z = Join(Array(a(i,1), a(i,2), a(i,3), a(i,4)),";") 
                If Not .exists(z) Then 
                    Redim w(1 To UBound(a,2)) 
                    For ii = 1 To UBound(a,2) : w(ii) = a(i,ii) : Next 
                        .add z, w 
                    End If 
                End If 
            Next 
            With ThisWorkbook.Sheets("sheet1") 
                a = .Range("a1", .Range("a" & Rows.Count).End(xlUp)).Resize(,9).Value 
            End With 
            Redim b(1 To UBound(a,1), 1 To UBound(a,2)) 
            For i = 2 To UBound(a,1) 
                If Not IsEmpty(a(i,1)) Then 
                    z = Join(Array(a(i,1), a(i,2), a(i,3), a(i,4)),";") 
                    If .exists(z) Then 
                        w = .item(z) 
                        For ii = 5 To UBound(a,2) 
                            If w(ii) <> a(i,ii) Then 
                                ThisWorkbook.Sheets("sheet1").Cells(i,ii).Interior.Color = vbRed 
                            End If 
                        Next 
                        .remove(z) 
                    Else 
                        n = n + 1 
                        For ii = 1 To UBound(a,2) 
                            b(n,ii) = a(i,ii) 
                        Next 
                    End If 
                End If 
            Next 
            If .count > 0 Then y = Application.Transpose(Application.Transpose(.items)) 
        End With 
        With ThisWorkbook.Sheets("sheet2").Range("a1") 
            .CurrentRegion.ClearContents 
            .Resize(,11).Value = [{"Only in Book2","","","","","","","","","","Only in Here"}] 
            If IsArray(x) Then .Offset(1).Resize(UBound(y,1) + 1, 9).Value = y 
            If n > 0 Then .Offset(,10).Resize(n,9).Value = b 
        End With 
    End Sub

Re-bonjour Alexis,

Juste deux conseils si tu veux avoir pas mal de réponses.

1/ Copie ton code avec la balise Code:

2/ Si tu peux fournir un fichier en exemple avec des chiffes annonymes par exemple.

Sub test() 
Dim a, i As Long, ii As Long, w(), b(), n As Long, y, z As String 
With Workbooks("test.xls").Sheets(1) 
a = .Range("a1", .Range("a" & Rows.Count).End(xlUp)).Resize(,9).Value 
End With 
With CreateObject("Scripting.Dictionary") 
.CompareMOde = vbTextCompare 
For i = 2 To UBound(a,1) 
If Not IsEmpty(a(i,1)) Then 
z = Join(Array(a(i,1), a(i,2), a(i,3), a(i,4)),";") 
If Not .exists(z) Then 
Redim w(1 To UBound(a,2)) 
For ii = 1 To UBound(a,2) : w(ii) = a(i,ii) : Next 
.add z, w 
End If 
End If 
Next 
With ThisWorkbook.Sheets("sheet1") 
a = .Range("a1", .Range("a" & Rows.Count).End(xlUp)).Resize(,9).Value 
End With 
Redim b(1 To UBound(a,1), 1 To UBound(a,2)) 
For i = 2 To UBound(a,1) 
If Not IsEmpty(a(i,1)) Then 
z = Join(Array(a(i,1), a(i,2), a(i,3), a(i,4)),";") 
If .exists(z) Then 
w = .item(z) 
For ii = 5 To UBound(a,2) 
If w(ii) <> a(i,ii) Then 
ThisWorkbook.Sheets("sheet1").Cells(i,ii).Interior.Color = vbRed 
End If 
Next 
.remove(z) 
Else 
n = n + 1 
For ii = 1 To UBound(a,2) 
b(n,ii) = a(i,ii) 
Next 
End If 
End If 
Next 
If .count > 0 Then y = Application.Transpose(Application.Transpose(.items)) 
End With 
With ThisWorkbook.Sheets("sheet2").Range("a1") 
.CurrentRegion.ClearContents 
.Resize(,11).Value = [{"Only in Book2","","","","","","","","","","Only in Here"}] 
If IsArray(x) Then .Offset(1).Resize(UBound(y,1) + 1, 9).Value = y 
If n > 0 Then .Offset(,10).Resize(n,9).Value = b 
End With 
End Sub

@+ et bonne journée.

Re-bonjour, ok merci du conseil je mettrai deux fichiers en exemple des que possible.

Je me sens un peu comme Achille dans Troie au debut du film, en version plus désespérée certes :"Il n'y a personne d'autre ??".

Bonjour à tous

Un essai à tester.

Bye !

Rechercher des sujets similaires à "comparer deux classeurs ressortir differences"