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
Bien le bonjour à tous en cette belle journée qui commence :D!

Mon problème est relativement simple mais j'arrive pas à répondre à mon besoin même en cherchant bien sur la toile (peut être que je ne cherche pas encore assez bien ^^!!)

Je commence par vous présenter mon code ca sera plus simple pour m'expliquer ou être compris :-p!

     
Dim LibelléOpération1 as String
Dim LibelléOpération2 as String

    LibelléOpération1 = "prelevemen"
    LibelléOpération2 = "Prélevement"
    
    '1er cas renvoie Faux alors que j'aimerai que ca renvoie Vrai
    MsgBox UCase(LibelléOpération2) Like UCase(LibelléOpération1)
    
    '2nd cas renvoie 1 alors que j'aimerai que ca renvoie 0
    MsgBox StrComp(UCase(LibelléOpération2), UCase( LibelléOpération1), vbTextCompare)
    
    '3eme cas renvoie 0 alors que j'aimerai un résultat différent de 0    
    Msgbox instr (1,UCase(LibelléOpération2), UCase( LibelléOpération1),vbTextCompare)

        


Les différents cas me permettent de comparer mes deux chaînes de caractères LibelléOpération1 et 2 mais aucune des fonctions me permet de revoyer Vrai ou 1 par exemple pour me dire que LibelléOpération1 correspond à LibelléOpération2 même si il manque une lettre ou un espace dans LibelléOpération2.

Existe t-il une telle fonction?

Merci infiniment pour votre aide.

Si je ne suis pas clair hésiter pas à me poser des question ;-)

Cordialement

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
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
1
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
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
0
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
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!
0
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
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
0