Forums Rue-Montgallet.com
Rue-Montgallet.comRue-Hardware.comRue-Occasion.comRue-DVD.comRue-Jeuxvideo.comRue-AudioVideo.comRue-Telephone.comForums
S'inscrire | S'identifier |
| Recherche avancée | Aide
 
 

Rutkowski, 1 utilisateur anonyme et 14 utilisateurs inconnus

 Mot :   Pseudo :  
 
Bas de page
Auteur
 Sujet :

Comparer 2 cellules mot à mot et renvoyer résultat dans une cellule

 
n°18753
Bouldu
Profil : Jeune recrue
Posté le 28-06-2007 à 10:51:09  profilanswer
 

Bonjour Galopin,
 
Pour faire suite au sujet "Comparaison ligne/ligne Excel", je souhaiterai comparer les cellules retourner par le macro. Il faut comparer chaque n° de client un par un avec les n° de client des cellules suivantes (vers la droite). Le but étant d'identifier si le n° de client se retrouve dans une autre cellule et afin de renvoyer le résultat en colonne K.  
 
Pour cela l'idéal serait d'avoir un condition qui indique que si au moins 1 n° se retrouve dans au moins 2 cellules différentes, alors on considère que le client existe en DB2 et on renvoie en K le résultat "DESIGNATED CLIENT X & Y...".  
 
Si le nom du client en DB1 est composé d'1 seul mot et que dans DB2 on retrouve excatement le mot avec un n° de client DB2 alors idem on affiche le résultat en colonne K.
 
Je joint un exemple ou j'ai surligné en rouge un échantillon de clients sur lesquelles on retrouve ces différents cas et le résultat attendu en colonne K.
 
http://cjoint.com/?gCkWJuvvAJ
 
J'espère avoir était clair sinon fais le moi savoir et je reverrai ma copie.
 
Merci encore pour ton aide.
 
A+

n°18761
galopin01
Profil : Membre
Posté le 28-06-2007 à 19:39:44  profilanswer
 

bonjour,
On trouve ça plus ou moins sur tous les forums avec plus ou moins de détails qui changent. Mais sur le fond le problème est le même : parcourir une colonne et pour chaque élément de la colonne comparer une autre colonne.
Dans ce cas le petit détail qui change c'est que avant la boucle de comparaison, il faut détecter s'il y a une ou plusieurs réponses. S'il y en a plusieurs,  il faut spliter l'occurence en cours, spliter chaque occurence de la deuxième série et comparer chaque élément de chaque Array, mettre un flag et stopper la routine si une concordance est trouvée et écrire les équivalences probables...
Je dis probable car en première observation, je pense que ça risuqe d'être un peu folklo, je n'attend pas plus de 75 % de résultats probant. Ce qui casse un peu le score c'est les "string" d'un seul mot et de 3 lettres. Beaucoup risquent d'être noyés dans une profusion de n° avec en bout de course, une seule équivalence...
Bon quoi qu'il en soit je vais me pencher dessus rien que pour laisser encore une autre méthode de comparaison...
Mais il faut prévoir un délai : je ne suis pas très disponible avant samedi...
A+


---------------
Je ne répondrai pas aux messages privés non sollicités. Merci de poser vos questions sur le forum.
n°18762
Bouldu
Profil : Jeune recrue
Posté le 29-06-2007 à 09:47:04  profilanswer
 

Bonjour Galopin,
 
C'est super sympa de ta part de mon côté je tatonne et si d'ici là (par miracle!) j'arrive à qque chose je te tiens au courant.
 
Merci
A+

n°18767
galopin01
Profil : Membre
Posté le 30-06-2007 à 17:23:26  profilanswer
 

Bonjour,
Ce topic fait suite à toute une série d'études sur la comparaison de colonnes EXCEL en VBA.
A partir de la saga de l'été 2006 de startom ou il était question de comparer des bribes de chaines d'une feuille à l'autre,  
on est passé récement à la comparaison de lignes et la mise en évidence de valeurs communes.
Cette dernière mouture reprend l'exemple précédent et l'affine à la recherche de "mots"
Enfin il s'agit non seulement de trouver des correspondances mais aussi de ramener (quand il y en a une) le numéro de ligne de ces correspondances.
Dans une recherche multimots, on peut considérer que si on recherche "agence blabla et Cie"
que "agence" est trouvé aux lignes 3 5 et 12
que "blabla" est retrouvé aux lignes 9 12 et 17
...on peut considérer que la ligne 12 est une réponse pertinente pour "agence blabla"
La présente démo fait donc réponse à ce problème avec quelques modifications par rapport aux études antérieures :
Au lieu de faire appel à Instr pour retrouver des bribes de chaines dans d'autres chaines, on a "splité" chaque chaine recherchée et on recherche chacun des mots en splitant également chaque cellule de la zone de recherche.
Celà à donc constitué un travail de reconstruction assez considérable, dont seul la stratégie est à retenir :
S'agissant de fichiers de plusieurs milliers de lignes il est exclu de passer en revue chaque cellule (ce qui nécessiterait un temps de traitement scatologique), il à donc été fait abondament appel à la technique des array, chaque élément de chaque array étant lui-même splité en un autre array afin de faire une comparaison stricte...
Débutants s'abstenir ! :(  
De plus toujours dans un souçi de conserver un temps de traitement acceptable le code à été optimisé en conséquence : pas question d'entrer dans des boucles interminables et inutiles !
Le bricoleur confirmé y trouvera peut-être son bonheur...
Le résultat.
En dépit de la demande de Bouldu le programme se contente de noter (en gras sur une colonne "variable" selon la quantité de données) le numéro de la(les) ligne supposées renvoyer un résultat. Selon mon estimation dans les conditions du fichier de Bouldu un résultat fiable à + de 90 % selon l'option choisie.  
Il subsiste à coup sur quelques anomalies dues pour une part au fait que j'ai codé un peu à la sauvette, mais on peut avoir un aperçu du résultat en ramenant en face de chaque N° de ligne le nom du client supposé afin d'avoir une vérification visuelle : Formule en L2 à tirer vers le bas :
=SI(ESTERR(DECALER('DB2'!C$1;K2-1;0));"";DECALER('DB2'!C$1;K2-1;0))
En jouant un avec l'option proposée dans le code on arrive à récupérer pas mal de choses, mais il reste que dans le cas de figure de Bouldu ou la comparaison comporte beaucoup d'imprécisions et d'aléas, un complément de vérification manuelle est indispensable: Quelquefois la comparaison échoue à une faute de frappe près...
 
A noter que (toujours dans un souçi de conserver un temps d'exécution acceptable) le travail de splitage n'a été effectué que pour la recherche de string de moins de 5 caractères : Au delà le gain est négligeable (tant en précision qu'en temps d'exécution) et Instr fait aussi bien l'affaire.
A+


Message édité par galopin01 le 30-06-2007 à 17:28:55

---------------
Je ne répondrai pas aux messages privés non sollicités. Merci de poser vos questions sur le forum.

Aller à :
Ajouter une réponse