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.