XL 2010 Comparaison de deux fichiers de base de donnée

erictran

XLDnaute Nouveau
Bonjour,

Je suis nouveau sur le forum, et je sollicite votre aide sur ce problème :

Je reçois périodiquement un fichier résultat d'une requête de base de donnée, et je recherche une macro pour mettre en évidence les changements sur le fichier de la semaine N+1 entre 2 lignes possédant la même ID entre les fichiers , sur le fichier de la semaine N+1 par rapport au fichier de la semaine N,

Dans mes fichiers, cet identifiant unique est en colonne G , libellé "ID". Je précise qu en semaine N+1 il peut y avoir de nouvelles lignes ,n'existant pas en semaine N, et qu'il faudrait alors mettre en évidence toute la ligne (tout en caractère rouge par exemple)

Je joins un modèle des fichiers concernés.

edit : je précise qu'il ne peut y avoir de suppression en N+1 par rapport à N mais que des ajouts ou modification

Infiniment merci pour votre aide !

Eric
 

Pièces jointes

  • résultat requête semaine 03.xlsx
    255 KB · Affichages: 36
  • résultat requête semaine 04.xlsx
    308.8 KB · Affichages: 8
Dernière édition:

mara58

XLDnaute Junior
Bonjour Eric,
Je ne connaît pas de fonctions qui permettrai cela; donc dans ce cas il faut trouver une astuce.
Voici en PJ ce que je vous propose... (en l’occurrence dans vos 2 fichiers joints il n'y aucun enregistrements identiques).
En fait il suffit de créer un BD qui compile les 2 fichiers, ensuite on crée un index qui concatène tous les champs , on compte le nombre de chaque index; s'il est en double , cela veut dire que les enregistrements sont identiques, si non ils sont uniques comme dans votre exemple.
Voilà, c'est un peu tordu mais ça marche.
J'espère que cela vous aidera
Excellente journée
Mara58

Nb : dans l'exemple, j'ai gardé que les 500 premiers enregistrements pour ne pas avoir un fichier trop lourd
 

Pièces jointes

  • 2021 01 23 recherche modif entre 2 fichiers.xlsx
    712 KB · Affichages: 5

erictran

XLDnaute Nouveau
Bonjour,

Merci pour vos réponses, et je m'excuse effectivement il ny a pas de correspondance car je me suis trompé d'année dans l'extract semaine 1, je viens de les corriger dans le post initial, je vais le tester avec votre fichier mara58 ,


merci & bonne journée à vous!
 

erictran

XLDnaute Nouveau
Bonjour Mara58

Merci j ai testé votre code qui fonctionne parfaitement merci. Néanmoins mon besoin est de mettre en évidence les écarts. J ai pas mal surfé hier soir sur le sujet et une solution accessible à mon niveau est avec la mise en forme conditionnelle et les fonctions index et equiv... bien évidemment il y a toujours un peu de manips avec cette soluce..

Bien à vous
 

mara58

XLDnaute Junior
Bonjour Mara58

Merci j ai testé votre code qui fonctionne parfaitement merci. Néanmoins mon besoin est de mettre en évidence les écarts. J ai pas mal surfé hier soir sur le sujet et une solution accessible à mon niveau est avec la mise en forme conditionnelle et les fonctions index et equiv... bien évidemment il y a toujours un peu de manips avec cette soluce..

Bien à vous
Mettez en ligne 2 fichiers à comparer , j'essaierai de trouver le temps de les mettre en œuvre avec ma méthode ensuite vous jugerez si cela vous convient.
Excellente journée
Mara58
 

erictran

XLDnaute Nouveau
Merci Mara58,

J'ai pu obtenir avec la mise en forme conditionnelle le résultat recherché : j'ai mis dans l'onglet S03 et S04 les 2 bases de données et dans l'onglet S04 deux mises en forme conditionnelles :
- 1 qui met en évidence les nouvelles lignes
- 1 qui met en évidence les modifications sur les lignes existantes dans les 2 BD

Je suis conscient que c'est beaucoup moins élégant qu'en VBA mais ca fait le job ;)

en tout cas merci de vous être penché sur ma question Mara58
 

Pièces jointes

  • requête commandes 2021.xlsx
    572.4 KB · Affichages: 4

sousou

XLDnaute Barbatruc
Bonjour
Fichier compare.
En rouge sur fichier antérieur et postérieur les différence
en Vert sur fichier antérieur les lignes n'existant pas sur le fichier postérieur
en bleu sur le fichier postérieur les nouvelles lignes
A voir!
 

Pièces jointes

  • compare.zip
    510.8 KB · Affichages: 21

erictran

XLDnaute Nouveau
Merci Sousou

J'avais bien vu que vous aviez fait une réponse sur un sujet similaire mais j'étais incapable de l'adapter!

Votre code marche parfaitement et évidemment beaucoup plus efficace que la mise en forme conditionnelle !

Encore merci, je vais tâcher de comprendre le fonctionnement de votre programme!
 

erictran

XLDnaute Nouveau
Bonjour Sousou

J'ai une petite question qui n'est pas directement lié au problème initial et je n'ai pas trouvé de réponse sur le net :
vous avez créé une variable dans le code VBA "var=L1.Columns.count"
Je comprends bien qu'il s'agit de compter les colonnes de la feuille L1, pour exécuter la comparaison sur chacune des colonnes des 2 tableaux une à une
mais comment retourne t'elle le bon résultat ? car il y a des cellules vides en dernière colonne du tableau qui doivent bien faire l'objet de la comparaison, mais également des cellules vides après la dernière colonne qui elles ne sont pas comptées

Ca fonctionne très bien, mais je ne comprends pas sur quel(s) critère(s) la fonction "columns.count" compte les colonnes si vous pouviez éclairer ma lanterne , merci infiniment!
 

erictran

XLDnaute Nouveau
et si je peux abuser encore un peu de votre temps :)

Au lieu de colorier la ligne entière détectée comme "nouvelle ligne" , je voudrais colorier la plage de colonnes 2 à 34 sur la ligne en question (j'ai mis en "commentaire" votre code dans l'extrait ci dessous)

mais le code que j'ai inséré, (de "Set Plage..." à "Plage.interior.color=bleu" envoie une erreur "erreur 1004, erreur définie par l'application ou l'objet grr:(, si vous pouviez m'aiguiller sur ce qui cloche là dedans , mille mercis!

VB:
 L.Parent.Rows(lg).Insert
    L.Parent.Rows(lg).Interior.Pattern = xlNone
    L.Parent.Rows(lg).Interior.Color = vert
    'L1.Parent.Rows(lg).Interior.Color = bleu
Set Plage = L1.Parent.Range(Cells(lg, 2), Cells(lg, 34))
    Plage.Interior.Color = bleu
 

sousou

XLDnaute Barbatruc
Bonjour
En fait il y a bien une erreur, et si tu mets un point d’arrêt après nbc=L1.columns.count, tu trouveras nbc= 16384, ce qui est beaucoup trop!!!, même si le résultat est identiques, puisque toutes les case sont vides.
Pour palier à cette erreur, remplacer
Call compare(fichN.Sheets(1), fichN1.Sheets(1))
par
Call compare(fichN.Sheets(1).UsedRange, fichN1.Sheets(1).UsedRange)
Ce qui permettra de travailler uniquement sur la zone des 33 colonnes utilisées
 

Discussions similaires

Réponses
0
Affichages
234