Lors d’une recherche de sous-chaine, il est parfois nécessaire de substituer les lettres accentuées par leurs équivalents sans accent.
En effet, le moteur Jet des bases de données Access est insensible à la casse des caractères mais ne fait pas le lien entre un caractère accentué et son équivalent.
La FAQ propose déjà deux fonctions ayant le même objectif, mais voici une troisième voie qui se caractérise par sa vitesse d’exécution et la possibilité ou non de conserver la casse des caractères de la chaine initiale.
La fonction en VBA
'Substituer les caractères accentués et conserver ou non la casse des caractères de la chaine
'La fonction est plus rapide :
' - si on ne conserve pas la casse des caractères de la chaine (par défaut)
' - si les deux constantes (cMajAvecAccent, cMajSansAccent) sont réduites au strict nécessaire
Const cMajAvecAccent As String = "ÀÁÂÃÄÅÇÐÈÉÊËÌÍÎÏÑÒÓÔÕÖŠÙÚÛÜÝŸŽ" 'Caractères à substituer (en MAJUSCULE)
Const cMajSansAccent As String = "AAAAAACDEEEEIIIINOOOOOSUUUUYYZ" 'Caractères de substitution (en MAJUSCULE)
Dim f As String, i As Long
If Not ConserverCasseChaine Then
Chaine = UCase$(Chaine)
For i = 1 To Len(cMajAvecAccent)
f = Mid$(cMajAvecAccent, i, 1)
If InStr(1, Chaine, f, vbBinaryCompare) > 0 Then
Chaine = Replace(Chaine, f, Mid$(cMajSansAccent, i, 1), , , vbBinaryCompare)
End If
Next i
Else
For i = 1 To Len(cMajAvecAccent)
f = Mid$(cMajAvecAccent, i, 1)
If InStr(1, Chaine, f, vbBinaryCompare) > 0 Then
Chaine = Replace(Chaine, f, Mid$(cMajSansAccent, i, 1), , , vbBinaryCompare)
End If
If InStr(1, Chaine, LCase$(f), vbBinaryCompare) > 0 Then
Chaine = Replace(Chaine, LCase$(f), LCase$(Mid$(cMajSansAccent, i, 1)), , , vbBinaryCompare)
End If
Next i
End If
SupprimerAccents = Chaine
End Function
La fonction est d’autant plus rapide si on ne conserve pas la casse de la chaine et si on réduit les caractères accentués recherchés au strict nécessaire.
Il est parfois utile de conserver la casse des caractères de la chaine dans une requête d’insertion ou de mise à jour ou si l’on souhaite faire une recherche sur la casse des caractères seulement.
Suivant les cas, il est performant de tester avant de rentrer dans les boucles si la longueur de la chaine est supérieure à zéro et/ou dans le cas où l’on souhaite conserver la casse, de faire un screening avant les deux recherches InStr().
Exemple d’utilisation
Dans la fenêtre Exécution du VBE :
?supprimeraccents("hêÒÓôdfgfdgÕÖÈÉfdg")
'Attendu: heOOodfgfdgOOEEfdg
?supprimeraccents("hêÒÓôdfgfdgÕÖÈÉfdg",True)
@+
Philippe
Merci, c’est simple et efficace.