Rechercher dans une base de données avec l’opérateur Like est assez trivial. Avec quelques jokers on arrive à retrouver ce que l’on souhaite. Cependant lorsque on a affaire à des contenus ayant des caractères accentués il est difficile de récupérer à la fois ceux qui en comporte et ceux qui n’en ont pas.
L’objet de ce billet est d’utiliser VBA pour contourner ce problème.
La première chose à faire est de créer une fonction qui va traiter le mot recherché.
Function ConvertAccForLike(strValue As String) As String ' Fabrice Constans (MVP ACCESS) mars 2016 If InStr(1, strValue, "a") > 0 Then strValue = Replace(strValue, "a", "[aàâä]") End If If InStr(1, strValue, "e") > 0 Then strValue = Replace(strValue, "e", "[eéèêë]") End If If InStr(1, strValue, "i") > 0 Then strValue = Replace(strValue, "i", "[iîï]") End If If InStr(1, strValue, "o") > 0 Then strValue = Replace(strValue, "o", "[oôö]") End If If InStr(1, strValue, "u") > 0 Then strValue = Replace(strValue, "u", "[uùûü]") End If ConvertAccForLike = strValue End Function
Dans cette fonction, on recherche la présence des voyelles, une à une, en commençant par le a, ensuite le e, puis le i, etc. Chaque fois que la voyelle est détectée on la remplace par la syntaxe Contient de l’opérateur Like, soit […]
Pour le mot « eleve », la valeur renvoyée sera :
"[eéèêë]l[eéèêë]v[eéèêë]"
Les mots trouvés seront :
eleve, éleve, élève, élevé…
Vous pouvez l’utiliser directement dans objet requête, une source de formulaire, une clause Where d’un OpenForm ou OpenReport comme dans une requête en VBA.
Voici son utilisation :
SELECT * FROM matable WHERE champ1 LIKE convertAccForLike("eleve");
Évidemment vous pouvez compléter avec les autres jokers.
SELECT * FROM matable WHERE champ1 LIKE convertAccForLike("eleve?");
Dans ce cas la valeur renvoyée sera :
"[eéèêë]l[eéèêë]v[eéèêë]?"
Ce bout de code fonctionne avec des tables liées, cependant lorsque vous utilisez d’autres bases de données comme Sql Server, MariaDB, PostgreSql, il vaut mieux travailler directement sur ces dernières pour des raisons évidentes de performance.
N’hésitez pas à laisser un commentaire.