Macro Comparaison Complexe

jacquesJ

XLDnaute Nouveau
[Toutes Versions]Macro Comparaison Complexe

Bonjour a Tous,

Voila je débute tout juste en VBA et en programmation. Je sollicite votre aide car je suis quelque peu bloqué sur un projet que je voudrais faire.

Petit Topo:

J'ai 2 Feuilles excel ouvertes dans un classeur.

Premiere Feuille:
-------A---------B----------------C-------------D-----------E
1--Modele---Reference---------TYPE-----------couleur-----MARQUE
2 ---serie1--------1-------------hybride----------bleu--------BMW
3 ---serie1--------2-------------motrice----------Rose---------BMW
4----blabla--------1-------------hybride----------Noir--------toyota
5----TT----------1-------------hybride-----------Noir----------audi
6----TT----------2------------motrice-----------Jaune---------audi
7----TT----------2------------course------------rose---------audi


Deuxieme Feuille:

-------A---------B----------------C-------------D-----------E
1--Modele---Reference---------TYPE-----------couleur---MARQUE
2 ---M5--------1-------------hybride----------bleu--------BMW
3 ---M5--------2-------------motrice----------Rose---------BMW
4----titi--------1-------------hybride----------Noir--------toyota
5----R8----------1-------------hybride---------Noir----------audi
6----R8----------2------------motrice-----------Jaune---------audi
7----R8----------2------------course------------vert---------audi



On peut voir dans ces tableaux qu'on a des groupes de marques et de voitures.

La colonne B , reference , montre que si la valeur = 1 alors c'est la voiture "principale" et si la valeur = 2
alors ce sont des déclinaisons du meme modele.

J'aimerais comparer les données équivalentes de la feuille 1 a celles de la Feuille 2.
Que signifie équivalente? On a 3 colonnes de comparaison qui seront forcément identiques (MARQUE,TYPE,Reference), et grace a celles-ci je pourrais comparer les autres colonnes qui elles pourraient différer
.En gros, si Marque(feuille1)=Marque(Feuill2) ET TYPE(Feuille1)=TYPE(Feuill2) ET Reference("Feuille1")=Reference(Feuille2) alors on compare les 2 lignes.cellules a cellules.Si il y a une erreur copier la ligne de la deuxieme feuille dans une nouvelle feuille excel.

Il faut ignorer le Modele, car il sera toujours différent.
En Gros au finale je devrais avoir une Feuille avec les lignes de Feuille 2 qui ont eu une différence lors de la comparaison.

Bien sur j'ai mis que le minimum ici, sinon il y a des milliers de lignes et des dizaines d'autre colonnes.
C'est pour ca qu'il faut un code VBA pour automatiser ca a grande echelle.

Je suis conscient que j'en demande beaucoup,c'est assez complexe je pense ,mais je seche la.Je ne sais pas trop comment m'y prendre.
Si vous avez au moins des indications, je suis preneur.

Bref je vous remercie de me lire, et je suis dispo pour des infos supplémentaires.
 
Dernière édition:

skoobi

XLDnaute Barbatruc
Re : Macro Comparaison Complexe

Bonsoir jacquesJ, bienvenue sur XLD,

Et bien j'espère que tu es motivés car si tu n'y connais presque rien en VBA, ça va pas être simple mais bon...
Première chose, pour faire simple:
Prépare un fichier avec ces données. Pour chaque feuille tu peux faire un filtre automatique pour lequel tu choisis les critères voulus: Marque, type et référence (ça va déjà réduire la liste pour l'analyse ultérieure en VBA).
Ensuite, reviens nous voir.
D'autres solutions sont surement possible mais c'est la plus simple qui me viens à l'esprit.
 

jacquesJ

XLDnaute Nouveau
Re : Macro Comparaison Complexe

Salut Skoobi ,



J’ai donc trié comme tu m’as dit. Et cela donne :



Code:
Sheets("Feuil3").Select
    Range("A1:E7").Select
    Range("E7").Activate
    Application.CutCopyMode = False
    Selection.Sort Key1:=Range("E2"), Order1:=xlAscending, Key2:=Range("C2") _
        , Order2:=xlAscending, Key3:=Range("B2"), Order3:=xlAscending, Header:= _
        xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
        DataOption1:=xlSortNormal, DataOption2:=xlSortNormal, DataOption3:= _
        xlSortNormal
 Sheets("Feuil4").Select
    Range("A1:E7").Select
    Range("E7").Activate
    Selection.Sort Key1:=Range("E2"), Order1:=xlAscending, Key2:=Range("C2") _
        , Order2:=xlAscending, Key3:=Range("B2"), Order3:=xlAscending, Header:= _
        xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
        DataOption1:=xlSortNormal, DataOption2:=xlSortNormal, DataOption3:= _
        xlSortNormal

Code:
MODELE REFERENCE TYPE   COULEUR        MARQUE

TT        2       course  Vert      audi
TT        1       hybride Noir      audi
TT        2       motrice jaune    audi
serie1   1        hybride Bleu      bmw
serie1   2       motrice  Rose     bmw
blabla   1        hybride Noir      honda


MODELE REFERENCE TYPE   COULEUR        MARQUE

TT        2          course  Vert      audi
TT        1          hybride Noir      audi
TT        2          motrice jaune    audi
serie1   1          hybride   Bleu      bmw
serie1   2          motrice   Rose    bmw
blabla   1          hybride Noir      honda



J'ai remplacer toyota par honda



Mais bon je ne comprends pas trop cette démarche, car mes tableaux de départs sont déjà triés,en Fonction de la marque,puis de la référence,puis du modele.

Enfn j’ai l’impression que ca revient au meme.



Petite précision sinon au niveau des données .Un groupe de données d’une marque peut contenir 1, 2 ou 3 lignes maximum: -Une ligne référence « 1 » ou -une ligne référence "1" + une ou deux lignes référence « 2 ».

Je montre les 3 cas dans les tableaux. Pour pouvoir différencier deux lignes de référence « 2 » de la meme marque , on se reporte au TYPE car il ne sera pas le même entre les deux.C’est donc grâce a ces 3 colonnes qu’on peut réussir une comparaison. (1 :Marque 2 :reference et 3:type)


Ce à quoi je pense est :

-Une boucle qui va checker dans les 2 tables les MARQUE qui correspondent,(ca va donc réduire les données a 2 groupes de lignes(1 ,2 ou 3 lignes comme dit précédemment) car il n’y aura qu’un seul groupe de lignes pour une marque, par tableau.

-Ensuite une boucle qui va checker dans les 2 tables la REFERENCE qui correspond.Donc ca va nous donner plus que 2 groupes de 1 ou 2 lignes(car pour Reference = "1" on aura forcément qu'une ligne par groupe donc 2 lignes à comparer, et pour Reference = "2" , on aura au maximum 2 lignes par groupe).


-Et enfin une boucle qui check dans les 2 tables le TYPE qui correspond. si lors de la boucle précédente il n’y avait que 2 groupes de 1 ligne, et bien cette boucle nous confirmera bien que ces 2 lignes seront les 2 correspondantes pour la comparaison.Et si lors de la boucle précédente, il y avait 2 groupes de 2 lignes(dans le cas ou il y a 2 lignes Reference = "2" de la même marque),alors cette boucle de TYPE va les départager et donc rendra possible la comparaison.


Et enfin quand ces boucles sont effectuées, faire la comparaison cellules à cellules des 2 lignes ,puis si il y a une cellule différente, alors exporter la ligne de la 2eme feuille dans une nouvelle feuille.


En gros je pense à une boucle avec du If à 3 conditions.


Boucle qui parcourt les 2 tableaux.

Do

If Marque(« Feuil1 »)=Marque(« Feuil2 ») And Reference(« Feuil1 »)=Reference(« Feuil2 ») And Type(« Feuil1 »)=Type(« Feuil2 »)
Then

If Ligne("Feuil1").EntireRow.Cells.Value = Ligne("Feuil2").EntireRow.Cells.Value
Then next Line
Else
Ligne("Feuil2").EntireRow.Copy Destination:=Worksheets("Report")

End If
End If
Loop



Ou peut être lorsque on a les 2 lignes à comparer , les copier dans une feuille temporaire ,puis faire la comparaison dans cette nouvelle feuille,exporter le résultat,fermer la feuille. Next Ligne.

J’ai pas mal d’idées mais je ne sais pas laquelle est la plus efficace.

C’est facile a dire c’est sur, car niveau code je pense que ca sera plusieurs boucles imbriquées.

Voila donc je vois schématiquement comment faire ca, seulement niveau code :s c’est une autre histoire. Désolé pour le pavé, mais je préfère être le plus clair possible.


J’espère que je ne te décourage pas.
 
Dernière édition:

skoobi

XLDnaute Barbatruc
Re : Macro Comparaison Complexe

Re bonjour jacquesJ,

J’espère que je ne te décourage pas.

Pas le moins du monde, je te rassure ;).

Je n'ai pas parlé de tri mais de filtre automatique, regarde bien mon message.
Ce que tu propose comme principe de code marche mais cela risque d'être très long...
il y a des milliers de lignes et des dizaines d'autre colonnes.
Il y a bien-sûr une autre façon de faire beaucoup plus rapide (à l'aide de tableau VBA et/ou le Dictionary).
Euuuhhh, tu me suis là, pas sûr :(.
Mais.... ne te décourage pas :D, je te donnerai des explications ;).
Dans l'attente de ton fichier.
 

jacquesJ

XLDnaute Nouveau
Re : Macro Comparaison Complexe

Salut Skoobi, je suis désolé pour ma confusion entre Tri et Filtre.

Par contre je ne vois pas l'intérêt du filtre non plus :D

Je te met tout de meme ci-joint mon fichier.
 

Pièces jointes

  • Classeur1 (Enregistré automatiquement).xlsm
    15.3 KB · Affichages: 112
  • Classeur1 (Enregistré automatiquement).xlsm
    15.3 KB · Affichages: 114
  • Classeur1 (Enregistré automatiquement).xlsm
    15.3 KB · Affichages: 111

skoobi

XLDnaute Barbatruc
Re : Macro Comparaison Complexe

Par contre je ne vois pas l'intérêt du filtre non plus :D

Bon, essayons d'être plus clair.
En reprenant ton fichier:
Sur la feuille 1:
  • on filtre la référence sur 1
  • on filtre le type sur course
  • on filtre la marque sur audi
-> logiquement il n'y aura qu'un seul résultat, c'est bien ça?

Sur la feuille 2:

  • même filtre que pour la feuille 1.
-> la liste ce réduira pour faire la comparaison. Bon là il n'y en a pas car tout est pareil...
On est toujours d'accord?

Il faudrait que tu donnes un exemple plus précis, proche de la réalité pour pouvoir entré dans le vif du sujet.
Euh et de préférence en version 2003 le fichier.... :rolleyes:
 

eriiic

XLDnaute Barbatruc
Re : Macro Comparaison Complexe

Bonsoir,

Es-tu sûr à 120% que les triplets Marque-Type-Modèle sont uniques en Feuil1 ?
Si ils le sont on s'arrete à la 1ère ligne trouvée, sinon il faut balayer toute la feuille si la 1ère occurence trouvée ne remplit pas les autres conditions.

Ci-joint une proposition par formule mais qui servira plus à valider le principe, car si tu as plusieurs dizaines de colonne ça risque d'être chaud.
Qcq colonnes d'ajoutées dont un critère supplémentaire bidon pour montrer comment cumuler les critères (et en plus avoir au moins ligne absente).

eric

PS: si tu joint à nouveau des fichiers met les au format xls, tu auras plus d'intervenants susceptibles de répondre

eric
 

Pièces jointes

  • jj.xls
    36 KB · Affichages: 100

jacquesJ

XLDnaute Nouveau
Re : Macro Comparaison Complexe

Désolé , j'ai plusieurs ordi et sur celui la j'ai la version 2010.

Pour la feuille 1 selon ton filtre en effet on aura qu'une ligne comme résultat.

Donc si on fait le meme filtre dans les 2 feuilles, en effet on retrouvera donc les 2 lignes qui sont comparables, et donc on va pouvoir comparer cellule à cellule.J'ai mis 2 tableaux identiques pour simplifier, mais le but de la comparaison c'est popur savoir justement si entre 2 lignes normalement. identiques,il y aura des différences .

Et que veux-tu comme exemple plus précis?
Car dans mes tableaux il y a donc les 3 cas envisagables, à savoir comme dit précédement, Soit 1 ligne Reference "1" seule , soit 1 groupe de lignes, 1 ligne avec reference "1" et une avec reference "2", soit 1 groupe de 3 lignes, avec toujours 1 ligne reference "1" et 2 lignes reference "2".Ces groupes la on les retrouve donc dans les 2 tableaux.Mais pour savoir quelle ligne du tableau 1 va avec quelle ligne du tableau 2,les 3 colonnes de selection rentrent en jeu. 1 Marque, 2 Reference et enfin la colonne Type, qui va permettre de départager lors des cas ou 2 lignes ayant comme valeur dans Reference: "2", car le type sera forcément différent entre ces 2 lignes.


-->@Eric: Salut, merci de m'aider également. Le Modele sera le meme dans chaque feuille, pour chaque Marque.Mais il sera forcément différent entre les 2 feuilles. C'est pour ca qu'il faut utiliser comme éléments de comparaison, la colonne Marque,puis Reference, puis Type.On pourrait meme virer la colonne modele, car elle ne sert a rien pour le la comparaison.Il faut meme l'exclure.

J'ai regardé ton fichier, si le "inconnu" c'est en gros le Not Ok, alors oui c'est bon.Car si tu as comparé les bonnes lignes entre elles,ce qui semble être le cas, en effet on retrouvera cette colonne H. Et sinon ,oui j'aurai plusieurs dizaines de colonnes.Apres avoir relu ton exemple, ce n'est pas bon en fait.Car dans tes 2 feuilles, le modele est le meme, or il sera forcément différent.La colonne modele n'est pas un critère de comparaison.Ce sont les colonnes Marque Reference et Type.

En gros : On a des données normalement identiques(de la meme forme,meme valeur,meme nombre de ligne,etc..) pour 2 modeles de voiture de la meme marque.1er modele dans la feuille 1 et 2eme modele dans la feuille 2.Et je veux donc comparer les lignes équivalentes pour etre sur qu'il n'y ait aucune différence.
 
Dernière édition:

eriiic

XLDnaute Barbatruc
Re : Macro Comparaison Complexe

Une proposition, mais vu le peu de lignes de ton fichier exemple je ne suis sûr de rien..
A tester sur un plus grand fichier.

Vu que les critères de test on l'air d'évoluer j'ai choisi le système suivant :
dans colonnes = Array(5, 3, 1, 2, 4, 6) tu choisis les colonnes à tester et leur ordre de test.
Le mieux est qu'elles soient par ordre décroissant de valeurs différentes, par exemple s'il y a plus de couleurs que de types, il vaut mieux que le champ couleur soit traité avant, que tu sortes de la boucle au plus tôt.
Si en plus ton tri des colonnes en Feuil1 respecte cet ordre tu accélèreras le traitement (dans cet exemple tu tries par marques, puis type, puis modèle, ... (toutes les marques sont donc regroupées)

Je te laisse tester

eric
 

Pièces jointes

  • jj.zip
    14.6 KB · Affichages: 53
  • jj.zip
    14.6 KB · Affichages: 55
  • jj.zip
    14.6 KB · Affichages: 53

jacquesJ

XLDnaute Nouveau
Re : Macro Comparaison Complexe

Salut Eric, j'ai regardé ton fichier.

Je n'ai pas regardé comment tu faisais ta comparaison, mais il y a un petit probleme.
Comme dit précédement, les criteres de selections des bonnes lignes correspondantes entre les 2 feuilles(qui sont colonne MARQUE, REFERENCE et TYPE) seront forcément identiques entre les 2 feuilles.

Or dans ton exemple:

TT 1 course vert Audi auto ("Feuil1")
TT 1 course vert tt auto ("Feuil2")

Sera impossible.
Par contre l'exemple de différence bon dans ton fichier est:

TT 2 motrice jaune Audi manuelle
TT 2 motrice jaune Audi auto

car ce sont 2 lignes comparables, puiseque toutes les 2 de marque Audi, de reference 2 puis de type motrice.Seulement ta macro ne releve pas la comparaison de celle ci.

Et sinon, pour les numéros de colonnes à inscrire, cela risque d'etre délicat car j'aurai plus de 50 colonnes au moins.

Je te ferai un nouveau fichier xls avec plus de lignes et colonnes.

En tout cas, Merci encore.
 

eriiic

XLDnaute Barbatruc
Re : Macro Comparaison Complexe

Bonjour,

Je ne comprend pas ce que tu veux dire par :
TT 1 course vert Audi auto ("Feuil1")
TT 1 course vert tt auto ("Feuil2")

Sera impossible.
Par contre l'exemple de différence bon dans ton fichier est:

TT 2 motrice jaune Audi manuelle
TT 2 motrice jaune Audi auto


Pour moi, quand on compare 2 feuilles on choisit les champs qui nous interessent (par exemple les colonnes 1,2,5 et 7, c'est à toi de mettre les colonnes qui t'interessent dans le array, dans l'ordre de traitement voulu pour accélérer la macro) et on regarde dans l'autre feuille si on trouve 1 ligne avec ces champs aux même valeurs.
Si on trouve c'est qu'elle est présente, sinon c'est qu'elle est absente (cqfd).
Soit un champ est déterminant auquel cas il doit figurer dans la liste, soit osef et il ne doit pas y être.
Maintenant il peut y avoir des bugs, dans ce cas dis clairement j'ai la ligne 5 de feuil2 présente en ligne 12 de feuil1 et tu la sors absente (ou l'inverse). Là je pourrais voir pourquoi.

Et sinon, pour les numéros de colonnes à inscrire, cela risque d'etre délicat car j'aurai plus de 50 colonnes au moins.
On pourra prévoir une saisie par tranche, par exemple 1,2,7,3-6,8-50.

eric

PS: si tu refais un fichier exemple plus complet met en couleur les colonnes servants lors de la comparaison (et modifie le array en conséquence), fais tourner la macro.
En feuil3 met en rouge les lignes ressorties par erreur, et plus bas 'manque:' suivi d'un collé des lignes manquantes (avec leur position en Feuil1 et Feuil2)
 
Dernière édition:

jacquesJ

XLDnaute Nouveau
Re : Macro Comparaison Complexe

En fait , je ne veux pas comparer Feuil1 avec Feuil2.
Je veux comparer les lignes entre les 2 feuilles qui correspondent.Donc dans la Macro, ce n'est pas juste une comparaison.Il y a aussi une selection.

Pour etre plus clair:

Dans les Tableau, on a des groupes de lignes qui correspondent à une marque.dans tableau 1 par exemple :audi, on traite du modele TT, dans Tableau 2, du modele R8(toi tu as mis pour les 2 TT, a la limite ce n'est pas grave).Dans ce groupe de lignes(la en l'occurence, il y a 3 lignes), on a une ligne avec en Reference: "1", car ce sera la ligne de la "voiture premiere",ou "voiture de reference",puis on a 2 autres lignes avec pour reference "2": des voitures dérivées de la voiture de reference.Donc en gros je veux comaprer la ligne voiture de reference de Audi(du modele TT donc de Feuille1 ) avec la voiture de reefrence de Audi(du modele R8 donc de Feuille2)
Pareil avec les autres lgines de Audi.Mais en l'occurence, il y a 2 voitures dérivées.Donc comment savoir comparer laquelle avec laquelle.Pour cela la colonne TYPE va nous servir car entre les 2 lignes le TYPE ne sera jamais le meme.
Donc en gros:
TT 2 course Vert audi = R8 2 course Vert audi
TT 2 motrice jaune audi = R8 2 motrice jaune audi

Je viens de remarquer que j'avais aussi mis le meme modele entre les 2 feuilles.Je m'en excuse car le modele sera toujours différent entre les 2 feuille.(meme si c'est pas tres grave).Donc il faudra exclure le modele lors de la comparaison.
Pour finir au niveau des groupe de lignes de la meem marque.On aura soit CAS1:qu'une seule ligne: la voiture de reference"Reference = "1"), soitCAS2: 2 lignes, la voiture de reference + une voiture dérivée, soit CAS3 la voiture de reference + 2 voitures dérivées.Donc si dans Feuil1 on a Renault clio CAS2, alors dans Feuil2 on aura Renault laguna CAS2.etc...

Mais la MARQUE, la REFERENCE et le TYPE sera toujours identique entre les 2 feuilles,C'est grace a ces colonnes qu'on fait la selection pour la comparaison.
Ce qu'on va comparer en gros c'est la couleur,la boite de vitesse dans ton exemple, + d'autres colonnes qui devront normalement etre identique mais seront susesptible de différer.(du style: type de pneu,option,etc..)

je ne sais pas si tu as compris.

Je mettrai un peu plus tard un fichier.



Edit: Tes remarques sont en effet fort interessantes, car maintenant je doute un peu sur ma facon de procédé. Peut-etre que grace a toi ,ca va etre plus simple que ce que je pensais.
Je vais réfléchir un peu et je te tiens au courant d'ici ce soir.
Vraiment Merci encore. Tu m'as peut etre ouvert les yeux sur quelque chose.
 
Dernière édition:

eriiic

XLDnaute Barbatruc
Re : Macro Comparaison Complexe

Je veux comparer les lignes entre les 2 feuilles qui correspondent.
C'est bien ce que fait la macro, chaque ligne de Feuil2 est comparée à chaque ligne de Feuil1.

je ne sais pas si tu as compris.
moi non plus ;-)
Je pense que je bloque avec ta notion de groupe de lignes mais vu qu'on compare ligne à ligne cette notion est-elle indispensable?
Et je n'ai pas trop le temps de lire dans le détail actuellement...

Le mieux est bien un fichier de test où tu marques en Feuil3 les lignes ressorties par erreur et pourquoi, et celles qui manquent et pourquoi.

eric
 

skoobi

XLDnaute Barbatruc
Re : Macro Comparaison Complexe

Bonjour jacquesJ, Eric,

Et que veux-tu comme exemple plus précis?
Et bien ceci:
Et sinon, pour les numéros de colonnes à inscrire, cela risque d'etre délicat car j'aurai plus de 50 colonnes au moins.
Je te ferai un nouveau fichier xls avec plus de lignes et colonnes.
Que se soit fidèle à la réalité, tout simplement.
Délicat ou pas, il faudra bien spécifier ces colonnes.
Et je te rassure, on trouvera une solution ;).

Dans l'attente de ton fichier.
 
Dernière édition:

Discussions similaires

Réponses
5
Affichages
451

Statistiques des forums

Discussions
311 729
Messages
2 081 971
Membres
101 852
dernier inscrit
dthi16088