Comparaison de chaines de caractères en VBA
Fermé
VBREBION
-
7 mars 2014 à 08:52
eriiic Messages postés 24600 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 21 octobre 2024 - 8 mars 2014 à 17:48
eriiic Messages postés 24600 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 21 octobre 2024 - 8 mars 2014 à 17:48
A voir également:
- Comparaison de chaines de caractères en VBA
- Caractères ascii - Guide
- Recherche automatique des chaînes ne fonctionne pas - Guide
- Caractères spéciaux clavier azerty - Guide
- Exemple de mot de passe à 8 caractères - Guide
- Caractères spéciaux - Guide
3 réponses
eriiic
Messages postés
24600
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
21 octobre 2024
7 239
8 mars 2014 à 10:02
8 mars 2014 à 10:02
Bonjour à tous,
Pour compléter j'ajouterai que tu peux utiliser les jokers :
? remplace n'importe quel caractère
* remplace n'importe quelle chaine
Et explique en français ce que tu veux obtenir exactement, c'est plus clair.
Par exemple lorsque tu dis même si il manque un espace dans LibelléOpération2 on peut te répondre d'utiliser replace() pour enlever les espaces sur les deux chaines.
Et si tu veux une comparaison moins stricte tu peux utiliser la distance de Damerau-Levenshtein (https://fr.wikipedia.org/wiki/Distance_de_Damerau-Levenshtein
Ci-joint un classeur où j'ai adapté ces fonctions pour excel : https://mon-partage.fr/f/FEVbbnVx/distance-de-damerau-levenshtein/
Sur la droite tu as un tableau qui te retourne cette distance en fonction d'un paramétrage (plafond). A toi de choisir ce plafond en fonction de ce que tu veux laisser passer comme erreur de saisie.
Attention au temps de calcul si tu as de nombreuses chaines.
eric
Pour compléter j'ajouterai que tu peux utiliser les jokers :
? remplace n'importe quel caractère
* remplace n'importe quelle chaine
Et explique en français ce que tu veux obtenir exactement, c'est plus clair.
Par exemple lorsque tu dis même si il manque un espace dans LibelléOpération2 on peut te répondre d'utiliser replace() pour enlever les espaces sur les deux chaines.
Et si tu veux une comparaison moins stricte tu peux utiliser la distance de Damerau-Levenshtein (https://fr.wikipedia.org/wiki/Distance_de_Damerau-Levenshtein
Ci-joint un classeur où j'ai adapté ces fonctions pour excel : https://mon-partage.fr/f/FEVbbnVx/distance-de-damerau-levenshtein/
Sur la droite tu as un tableau qui te retourne cette distance en fonction d'un paramétrage (plafond). A toi de choisir ce plafond en fonction de ce que tu veux laisser passer comme erreur de saisie.
Attention au temps de calcul si tu as de nombreuses chaines.
eric
via55
Messages postés
14495
Date d'inscription
mercredi 16 janvier 2013
Statut
Membre
Dernière intervention
7 novembre 2024
2 735
Modifié par via55 le 8/03/2014 à 00:57
Modifié par via55 le 8/03/2014 à 00:57
Bonjour
1) ton 1er cas compare les 2 chaines, puisqu'elle ne sont pas identiques il ne peut pas renvoyer Vrai ! si par contre tu veux tester que les 2 chaines sont différentes et que la msgbox te renvoie Vrai (oui elles sont différentes) il faut écrire : MsgBox Not(UCase(LibelléOpération2) Like UCase(LibelléOpération1))
2) le 2eme cas compare la longueur de la chaine 2 par rapport à la chaine 1 : le résultat est 1 puis qu'elle comporte une lettre de + (si tu avais comparé chaine 1 à chaine 2 tu aurais obtenu -1)
3) le 3eme cas inspecte si la chaine 2 (1er argument) est une sous-chaine de la chaine 1 et renvoie 0 car chaine 2 n'est pas comprise dans chaine 1
Par contre si tu inverses les arguments , c'est 1 qui te sera renvoyé car la chaine 1 est une sous-chaine de chaine 2 à partir du caractère n° 1
Le cas n° 2 ne t'est pas utile à grand chose : comparer CHIEN et CHAT renverra 1 tout comme la comparaison de CHIENS et CHIEN
Le 3eme cas te permet de traiter une lettre oubliée au début ou à la fin mais pas à l'intérieur du mot, ni les inversions (Perlevement au lieu de Prelevement)
Cela suppose une macro bien plus complexe !
Par exemple pour le seul oubli d'une lettre il faudrait prendre le mot type écrit juste, faire une boucle sur son nombre de lettres et enlever chaque fois une lettre (la 1ere, puis la 2eme etc) et comparer ce résultat au second mot pour voir s'il y a une correspondance
Pour les inversions c'est encore plus compliqué
Et si tu veux gérer aussi les fautes d'orthographes, par exemple admettre que Prélevemant équivaut à Prelevement, alors là bon courage !
Cdlmnt
"L'imagination est plus importante que le savoir." A. Einstein
1) ton 1er cas compare les 2 chaines, puisqu'elle ne sont pas identiques il ne peut pas renvoyer Vrai ! si par contre tu veux tester que les 2 chaines sont différentes et que la msgbox te renvoie Vrai (oui elles sont différentes) il faut écrire : MsgBox Not(UCase(LibelléOpération2) Like UCase(LibelléOpération1))
2) le 2eme cas compare la longueur de la chaine 2 par rapport à la chaine 1 : le résultat est 1 puis qu'elle comporte une lettre de + (si tu avais comparé chaine 1 à chaine 2 tu aurais obtenu -1)
3) le 3eme cas inspecte si la chaine 2 (1er argument) est une sous-chaine de la chaine 1 et renvoie 0 car chaine 2 n'est pas comprise dans chaine 1
Par contre si tu inverses les arguments , c'est 1 qui te sera renvoyé car la chaine 1 est une sous-chaine de chaine 2 à partir du caractère n° 1
Le cas n° 2 ne t'est pas utile à grand chose : comparer CHIEN et CHAT renverra 1 tout comme la comparaison de CHIENS et CHIEN
Le 3eme cas te permet de traiter une lettre oubliée au début ou à la fin mais pas à l'intérieur du mot, ni les inversions (Perlevement au lieu de Prelevement)
Cela suppose une macro bien plus complexe !
Par exemple pour le seul oubli d'une lettre il faudrait prendre le mot type écrit juste, faire une boucle sur son nombre de lettres et enlever chaque fois une lettre (la 1ere, puis la 2eme etc) et comparer ce résultat au second mot pour voir s'il y a une correspondance
Pour les inversions c'est encore plus compliqué
Et si tu veux gérer aussi les fautes d'orthographes, par exemple admettre que Prélevemant équivaut à Prelevement, alors là bon courage !
Cdlmnt
"L'imagination est plus importante que le savoir." A. Einstein
phirexian
Messages postés
11
Date d'inscription
mardi 14 mai 2013
Statut
Membre
Dernière intervention
8 mars 2014
8 mars 2014 à 14:05
8 mars 2014 à 14:05
Whaouhhh Eric tu déchires tout :D!! Merci
Merci également pour tes commentaires et ton aide précieuse Via.
Eric ta fonction est juste énorme, en fait si je comprends bien, ta fonction évalue l'équivalence de deux chaînes de caractères et renvoie une valeur en pourcentage , c'est ca?
C'est à dire qu'en "dupond" et "dupont", il y a 86% d'équivalence?
Si j'essaie de comprendre ton code, tu as construit une fonction qui n'existe pas encore dans excel et tu l'as codé cette "construction" dans un module VBA?
Merci encore pour vos réponses ca m'aide vraiment :D!
Merci également pour tes commentaires et ton aide précieuse Via.
Eric ta fonction est juste énorme, en fait si je comprends bien, ta fonction évalue l'équivalence de deux chaînes de caractères et renvoie une valeur en pourcentage , c'est ca?
C'est à dire qu'en "dupond" et "dupont", il y a 86% d'équivalence?
Si j'essaie de comprendre ton code, tu as construit une fonction qui n'existe pas encore dans excel et tu l'as codé cette "construction" dans un module VBA?
Merci encore pour vos réponses ca m'aide vraiment :D!
eriiic
Messages postés
24600
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
21 octobre 2024
7 239
8 mars 2014 à 17:48
8 mars 2014 à 17:48
ta fonction évalue l'équivalence de deux chaînes de caractères et renvoie une valeur en pourcentage , c'est ca?
Pour les fonctions 'Normalized xxx' en gros oui.
Pour la fonction 'damerau_levenshtein plafonné' c'est une distance. Je préfère celle-ci qui combine les deux fonctions. Plus la distance est faible, plus les chaines se ressemblent. Deux chaines identiques ont une distance de 0. Voir I4:L15
Tu pourrais utiliser cette fonction avec un plafond de 4 et accepter les distances <= 2.
Ou <=1 si tu la trouves trop laxiste, ou <=3 si tu veux laisser passer plus d'erreurs (mais là risque de trouver des équivalence fausses.
Supprime tes espaces avant.
Si j'essaie de comprendre ton code, tu as construit une fonction qui n'existe pas encore dans excel et tu l'as codé cette "construction" dans un module VBA?
Voilà, c'est une fonction personnalisée.
eric
Pour les fonctions 'Normalized xxx' en gros oui.
Pour la fonction 'damerau_levenshtein plafonné' c'est une distance. Je préfère celle-ci qui combine les deux fonctions. Plus la distance est faible, plus les chaines se ressemblent. Deux chaines identiques ont une distance de 0. Voir I4:L15
Tu pourrais utiliser cette fonction avec un plafond de 4 et accepter les distances <= 2.
Ou <=1 si tu la trouves trop laxiste, ou <=3 si tu veux laisser passer plus d'erreurs (mais là risque de trouver des équivalence fausses.
Supprime tes espaces avant.
Si j'essaie de comprendre ton code, tu as construit une fonction qui n'existe pas encore dans excel et tu l'as codé cette "construction" dans un module VBA?
Voilà, c'est une fonction personnalisée.
eric