Comparaison de feuilles dans un classeur

Bonjour tout le monde,

Je vous sollicite encore une fois de plus pour compléter mon fichier.

En effet, je souhaite un macro qui va comparer des fichiers dans le même classeur et enregistrer la différence dans une autre feuille.

Je joins un fichier à titre d'exemple qui montre ce que je veux finaliser.

Peut-être que le sujet avait été déjà traité mais je ne le vois pas.

Je vous remercie d'avance!

27compare.xlsm (13.16 Ko)

Bonjour Brodyeva,

je te retourne ton fichier modifié :

28compare.xlsm (21.69 Ko)

* tu peux voir que la feuille "Différence" est entièrement vide

* va sur la feuille "Delta" ; fais Ctrl e ➯ travail effectué !

* va sur la feuille "Différence"


Alt F11 pour voir le code VBA, puis revenir sur Excel

si besoin, tu peux demander une adaptation.

merci de me dire si ça te convient.

dhany

Bonjour dhany,

Ça va au delà de ce que je voulais.

Merci beaucoup.

merci pour ton retour ! bonne continuation !

dhany

Bonjour Brodyeva,

voici l'explication détaillée du code VBA :


1) en début de module, et hors d'une sub :

Option Explicit : pour obliger à déclarer les variables

Dim shD As Worksheet, dlig&, col As Byte, lg2& : 4 variables de niveau global ; dlig& : idem que dlig As Long

ces 4 variables sont connues des 2 subs, et c'est inutile que la sub CompData() les envoie à la sub Job().


2) sub CompData()

If ActiveSheet.Name <> "Delta" Then Exit Sub : si le nom de la feuille active n'est pas "Delta", on sort de la sub

dlig = Cells(Rows.Count, 1).End(3).Row : dernière ligne utilisée, selon la colonne A

idem que : dlig = Cells(Rows.Count, "A").End(xlUp).Row ; dlig = 29

If dlig = 1 Then Exit Sub ; si la dernière ligne utilisée est 1 : c'est la ligne des entêtes, donc le tableau est vide ;

et comme y'a aucune donnée, on sort de la sub

Set shD = Worksheets("Différence") : shd référence la feuille "Différence" (qui est la feuille des futurs résultats)

Application.ScreenUpdating = 0 : désactive la mise à jour de l'écran ➯ l'exécution du code est plus rapide

shD.Cells.Clear : on efface toutes les cellules de la feuille "Différence", pour éviter tout mélange des anciens résultats avec les nouveaux ; sans cette instruction, tu serais obligé d'effacer manuellement tous les résultats avant de lancer la macro.

col = 1 : colonne n° 1, donc colonne A

Job "Alpha" appel de la sub Job() en transmettant le texte "Alpha", qui est le nom de la 1ère feuille

Job "Beta" appel de la sub Job() en transmettant le texte "Beta", qui est le nom de la 2ème feuille ;

cet appel est fait 5× dans la boucle For col = 2 To 6 .. Next col donc pour les colonnes B à F

toute la suite se passe dans la sub Job() : elle fait le même travail

pour chaque feuille à comparer avec la feuille "Delta".


3) sub Job()

Private Sub Job(chn$) : la sub est privée car elle ne doit être appelée que par une autre sub du même module,

en l'occurrence CompData() ; elle ne peut donc pas être appelée directement par l'utilisateur (via Alt F8), ni par une

sub d'un autre module ; elle reçoit dans la variable chn le texte envoyé ; chn$ : idem que chn As String

Dim FX As Worksheet, lig& : 2 variables locales à la sub en cours d'exécution

Set FX = Worksheets(chn) : FX référence la feuille dont le nom est dans chn

selon l'appel, la feuille référencée est donc "Alpha" ou "Beta"

lg2 = 1 : n° ligne pour écrire en feuille "Différence" (destination) ; on écrira donc

les résultats sur la feuille "Différence" à partir de la ligne n° 1

For lig = 2 To dlig .. Next lig ; lig : n° ligne pour lire la feuille FX (source) ; boucle de 2 à dlig ➯ de 2 à 29

c'est donc ce qui permet de parcourir toutes les lignes de données, et la suite est pour chacune d'elles

With FX.Cells(lig, col) .. End With : avec la cellule de la feuille FX (Alpha ou Beta), ligne lig colonne col

If Cells(lig, col) <> .Value Then .. End If : si la cellule ligne lig colonne col de la feuille active (Delta)

est différente de celle référencée par le With (en résumé : si y'a une différence entre les 2 valeurs comparées )

shD.Cells(lg2, col) = Cells(lig, col) : la cellule ligne lg2 colonne col de la feuille shD (Différence)

reçoit la valeur de la cellule lig col de la feuille active (Delta)

Cells(lig, col) = .Value : puis la cellule lig col de la feuille active (Delta) reçoit la valeur de la cellule

de la feuille FX (Alpha ou Beta) ; ça va ? tu suis toujours ?

lg2 = lg2 + 1 : n° ligne lg2 augmenté de 1 pour écrire le prochain résultat une ligne en dessous ;

c'est fini : c'était la dernière instruction à expliquer, tu peux aller dormir !

dhany

@Brodyeva : pas de retour sur mon explication du code VBA ?

Bonjour dhany,

C'est vraiment immense ce que tu as produit comme explication du code. Je reste sans voix parce que c'est clair et net.

Merci beaucoup. Très très heureux.

merci pour ton retour ! bonne fin de journée !

dhany

Rechercher des sujets similaires à "comparaison feuilles classeur"