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.