Comparer deux feuille et créer une feuille d'écarts

Aimedjie

XLDnaute Occasionnel
Bonjour à tous,

Dans un fichier Excel, j'ai une feuille de calcul avec plusieurs lignes contenant le nom d’employés (une ligne pour chaque employé) et plusieurs colonnes contenant les montants inscrits sur leur talon de paie.

J'aimerais avoir une macro qui me permettrait de créer une feuille qui indiquerait ensuite toutes les modifications apportées à la feuille originale.

Le pépin est que je ne peux pas comparer chaque cellule de l’originale avec la cellule qui possède les mêmes coordonnées sur la copie puisqu'il peut arriver que j'insère d'autres employés. Ainsi, tous les montants inscrits dans les colonnes de l’originale génèrent des écarts alors que les montants sont identiques pour les mêmes employés. Par exemple, je ne peux pas comparer B5(originale) avec B5(copie) puisque j’ajoute un employé sur la ligne 4. Donc, B5(originale) doit plutôt être comparé à B4(copie).

De plus, comme j'ai environ 5000 lignes et 50 colonnes, je crois qu'analyser chaque cellule sera beaucoup trop lourd pour le fichier.

Donc, la macro doit identifier, pour chaque employé, les montants qui ne sont plus les mêmes ainsi que les nouveaux employés et ceux qui ont été supprimés.
 

Pièces jointes

  • Comparaison.xls
    20 KB · Affichages: 136
  • Comparaison.xls
    20 KB · Affichages: 135
  • Comparaison.xls
    20 KB · Affichages: 141

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
Re : Comparer deux feuille et créer une feuille d'écarts

Bonjour,

Avec MFC:

=INDEX(MaBD2;EQUIV($A2;INDEX(MaBD2;;1);0);COLONNE())<>A2
=ET(A2<>"";ESTNA(EQUIV($A2;INDEX(MaBD2;;1);0)))

JB
 

Pièces jointes

  • Copie de Comparaison(1).xls
    22 KB · Affichages: 121

jp14

XLDnaute Barbatruc
Re : Comparer deux feuille et créer une feuille d'écarts

Bonjour
Re JB


Ci joint un fichier avec une macro.
Sélection des feuilles avec un USF
Recherche des noms supprimés
Recherche des noms ajoutés
Recherche des différences au niveau de la colonne B
Affichage des écarts.

A tester

JP
 

Pièces jointes

  • Comparaison.zip
    22.6 KB · Affichages: 96
  • Comparaison.zip
    22.6 KB · Affichages: 98
  • Comparaison.zip
    22.6 KB · Affichages: 94

pierrejean

XLDnaute Barbatruc
Re : Comparer deux feuille et créer une feuille d'écarts

Bonjour Aimedjie

Vois si cela te convient

Edit: Salut JP :)
 

Pièces jointes

  • Comparaison.zip
    16.4 KB · Affichages: 100
  • Comparaison.zip
    16.4 KB · Affichages: 100
  • Comparaison.zip
    16.4 KB · Affichages: 103

Aimedjie

XLDnaute Occasionnel
Re : Comparer deux feuille et créer une feuille d'écarts

C'est parfait pierrejean, mais est-ce possible de la commenter maintenant pour que je puisse d'abord la comprendre et ensuite l'incorporer dans mon fichier.

Encore une fois merci!
 

nolich

XLDnaute Occasionnel
Re : Comparer deux feuille et créer une feuille d'écarts

Bonjour Aimedjie, JB, JP et PierreJean, bonjour à toutes et à tous,

Pour PierreJean : je suis ce fil depuis le début, ou presque, mais je pense que tes explications ne seront pas très claires sans fichier joint ;)

Par contre, et ce n'est pas une remarque désobligeante, je vois que tu scannes les cellules directement sur la feuille copie. Ne crois-tu pas qu'un simple tableau pourrais être plus rapide ?

@+
 

Aimedjie

XLDnaute Occasionnel
Re : Comparer deux feuille et créer une feuille d'écarts

Est-ce que le fichier fonctionne si le nombre de lignes de la feuille originale est différent du nombre de ligne de la feuille copie et vice-versa? J'ai inséré des lignes dans la feuille copie et je me suis retrouvé avec deux employés nommés total...

Merci.
 

pierrejean

XLDnaute Barbatruc
Re : Comparer deux feuille et créer une feuille d'écarts

Re

Toutes mes excuses !!!!
J'ai oublié de joindre le fichier
Le voici
 

Pièces jointes

  • Comparaison.zip
    17.8 KB · Affichages: 152
  • Comparaison.zip
    17.8 KB · Affichages: 153
  • Comparaison.zip
    17.8 KB · Affichages: 155

pierrejean

XLDnaute Barbatruc
Re : Comparer deux feuille et créer une feuille d'écarts

Re

Normalement si les employés sont ajoutés en inserant des lignes (ce qui parait normal vu que la derniere est un total) le fonctionnement sera assuré meme si le nombre de lignes est different en Originale et Copie

@nolich
Exact un (ou plutot 2) tableau(x) serait(ent) plus rapides mais a moins d'avoir affaire a une multinationale le scan sur feuille devrait suffire
D'autre part rien ne s'oppose ,bien au contraire, a ce que tu proposes une solution exploitant cette possibilité
 

nolich

XLDnaute Occasionnel
Re : Comparer deux feuille et créer une feuille d'écarts

Re, bonjour à toutes et à tous,

Tu as raison, PierreJean : inutile de compliquer les chose quand elles peuvent être faites simplement. En tout cas, j'ai apprécié ton code.

@+
 

Aimedjie

XLDnaute Occasionnel
Re : Comparer deux feuille et créer une feuille d'écarts

Bonjour pierrejean,

J'ai modifié un peu la procédure pour l'adapter à mon fichier et il trouve aucun écart. Est-ce possible de savoir ce qui cloche?

Public Sub comparaison(ByVal feuilleDeclare As Worksheet, feuilleVerifie As Worksheet, _
feuilleComparaison As Worksheet, colCodeDeclare As Long, _
hautDeclare As Long, colNomComparaison As Long, _
colTotalRepartitionComparaison As Long)

'==========================================================================
'Identifier tous les écarts entre la feuille originale et la copie.
'==========================================================================

Dim listeCompleteEmploye As Collection
Dim totalEmploye As Collection
Dim ligneEmployeDeclare As Long, ligneEmployeVerifie As Long
Dim nbEmploye As Long, chaqueEmploye As Long
Dim colonneSomme As Long, colCompare As Long
Dim ligne As Long, derniereLigneComparaison As Long
Dim rangeEmployeDeclare As Range, rangeEmployeVerifie As Range

'Déclaration des 3 collections.
Set listeCompleteEmploye = New Collection
Set totalEmploye = New Collection

'Déverrouiller toutes les feuilles impliquées.
Call protectSheet(False, feuilleDeclare)
Call protectSheet(False, feuilleVerifie)
Call protectSheet(False, feuilleComparaison)

'Supprimer toutes les cellules pour démarrer avec une feuille vierge.
feuilleComparaison.Select
feuilleComparaison.Cells.Delete shift:=xlUp

'Remplissage de la collection des employés de la feuille employeur.
For ligneEmployeDeclare = hautDeclare To feuilleDeclare.Cells(65536, _
colCodeDeclare).End(xlUp).Row - 1

On Error Resume Next

listeCompleteEmploye.Add feuilleDeclare.Cells(ligneEmployeDeclare, _
colCodeDeclare), _
CStr(feuilleDeclare.Cells(ligneEmployeDeclare, _
colCodeDeclare))

On Error GoTo 0

Next ligneEmployeDeclare

'Remplissage de la collection des employés de la feuille répartition.
For ligneEmployeVerifie = hautDeclare To _
feuilleVerifie.Cells(65536, _
colCodeDeclare).End(xlUp).Row - 1

On Error Resume Next

listeCompleteEmploye.Add feuilleVerifie.Cells(ligneEmployeVerifie, _
colCodeDeclare), _
CStr(feuilleVerifie.Cells(ligneEmployeVerifie, _
colCodeDeclare))

On Error GoTo 0

Next ligneEmployeVerifie

'Remplissage de la collection de tous les employés.
For nbEmploye = 1 To listeCompleteEmploye.Count
On Error Resume Next
totalEmploye.Add listeCompleteEmploye(nbEmploye), _
CStr(listeCompleteEmploye(nbEmploye))
On Error GoTo 0
Next nbEmploye

'Ligne de depart rangeEmployeVerifie'écriture dans la feuille Comparaison.
ligne = hautDeclare

'Rechercher chaque employé dans la feuille employeur et la feuille répartition.
For chaqueEmploye = 1 To totalEmploye.Count

Set rangeEmployeDeclare = feuilleDeclare.Columns(colNomComparaison) _
.Find(totalEmploye(chaqueEmploye), _
LookIn:=xlValues, lookat:=xlWhole)
Set rangeEmployeVerifie = feuilleVerifie.Columns(colNomComparaison) _
.Find(totalEmploye(chaqueEmploye), _
LookIn:=xlValues, lookat:=xlWhole)

'Valider Si l'employé se trouve uniquement dans une feuille.
If rangeEmployeDeclare Is Nothing Or rangeEmployeVerifie Is Nothing Then

'Copier la ligne dans la feuille où l'employé est inscrit et la coller directement dans
'la feuille comparaison.
If rangeEmployeDeclare Is Nothing Then

feuilleVerifie.Range(Cells(rangeEmployeVerifie.Row, _
colNomComparaison).Address & ":" _
& Cells(rangeEmployeVerifie.Row, _
colTotalRepartitionComparaison).Address) _
.Copy Destination:=feuilleComparaison.Cells(ligne, 1)

ligne = ligne + 1

End If

If rangeEmployeVerifie Is Nothing Then

feuilleDeclare.Range(Cells(rangeEmployeDeclare.Row, 1).Address & ":" _
& Cells(rangeEmployeDeclare.Row, _
colTotalRepartitionComparaison).Address) _
.Copy Destination:=feuilleComparaison.Cells(ligne, 1)

ligne = ligne + 1

End If

'Si par contre, l'employé se trouve dans les feuilles employeur et répartition, il faut
'analyser toutes les colonnes.
Else

For colCompare = colNomComparaison To colTotalRepartitionComparaison

'Si la valeur dans la feuille employeur diffère de celle de la feuille répartition,
'il faut copier le nom de l'employé et le coller dans la colonne A de la feuille
'comparaison.
If feuilleVerifie.Cells(rangeEmployeVerifie.Row, colCompare) <> _
feuilleDeclare.Cells(rangeEmployeDeclare.Row, colCompare) Then

feuilleComparaison.Cells(ligne, 1) = totalEmploye(chaqueEmploye)

'Ensuite, il faut copier toutes les differences de cet employé et les coller dans la
'la feuille comparaison.
If feuilleDeclare.Cells(rangeEmployeDeclare.Row, colCompare) - _
feuilleVerifie.Cells(rangeEmployeVerifie.Row, colCompare) <> 0 Then

feuilleComparaison.Cells(ligne, colCompare) = _
feuilleDeclare.Cells(rangeEmployeDeclare.Row, colCompare) - _
feuilleVerifie.Cells(rangeEmployeVerifie.Row, colCompare)

Else

feuilleComparaison.Cells(ligne, colCompare) = "-"

End If

ligne = ligne + 1

Exit For

End If

Next colCompare

End If

Next chaqueEmploye

'Définir la dernière ligne de la colonne A de la feuille comparaison.
derniereLigneComparaison = feuilleComparaison.Cells(65536, _
colCodeDeclare).End(xlUp).Row + 1

'S'il n'y a aucun écart, un message doit s'inscrire plutôt que des totaux.
If derniereLigneComparaison < hautDeclare Then

feuilleComparaison.Cells(derniereLigneComparaison, 1) = "Il n'y a aucun écart."
feuilleComparaison.Cells(derniereLigneComparaison, 1).Font.Bold = True

'Sinon, identifier la ligne total et inscrire les formules de somme et mettre la ligne
'en gras.
Else

feuilleComparaison.Cells(derniereLigneComparaison, 1) = "Total"
feuilleComparaison.Cells(derniereLigneComparaison, 1).Font.Bold = True

For colonneSomme = colNomComparaison To colTotalRepartitionComparaison

feuilleComparaison.Cells(derniereLigneComparaison, _
colonneSomme).FormulaLocal = _
"=SOMME(" & Cells(hautDeclare, colonneSomme).Address & ":" _
& Cells(derniereLigneComparaison - 1, colonneSomme).Address & ")"

feuilleComparaison.Cells(derniereLigneComparaison, _
colonneSomme).Font.Bold = True

Next colonneSomme

End If

'Protéger toutes les feuilles impliquées.
Call protectSheet(True, feuilleDeclare)
Call protectSheet(True, feuilleVerifie)
Call protectSheet(True, feuilleComparaison)

End Sub


Merci.
 

Aimedjie

XLDnaute Occasionnel
Re : Comparer deux feuille et créer une feuille d'écarts

Bonjour pierrejean,

Merci beaucoup pour ta macro. Elle fonctionne maintenant à merveille. Par contre, je crois qu'il y a un petit problème. La macro ne reconnait pas les doublons alors qu'il se peut qu'il y ait deux employés avec le même nom, mais la macro doit considérer deux personnes plutôt qu'une seule.

J'ai ouvert plusieurs discussions pour donner des numéros d'identification à chaque employé afin d'éviter les doublons, mais je n'ai pas eu de réponse.

Est-ce que quelqu'un peut adapter la macro de pierrejean pour qu'elle considère les doublons?

Merci.
 

marine13210

XLDnaute Nouveau
Re : Comparer deux feuille et créer une feuille d'écarts

Re

Toutes mes excuses !!!!
J'ai oublié de joindre le fichier
Le voici

Bonjour,

Je suis nouvelle sur le site, mais j 'ai remarqué que beaucoup de personnes se débrouillent merveilleusement bien avec excel...

J'ai un besoin particulier, j'ai un fichier excel permanent à remplir avec un autre fichier excel que j'exporte d'une base de donnée. Seulement le fichier exporté ne comporte pas toutes les lignes du fichier de base qu'il faut que je remplisse chaque mois...de faire des 'va et viens' entre chaque fichier entraine des erreurs , et je suis sure qu'il doit exister une solution...auriez vous une solution pour moi ???


Merci par avance
 

Discussions similaires

Statistiques des forums

Discussions
312 393
Messages
2 088 006
Membres
103 698
dernier inscrit
Guillaume MPOYI