Il est parfois nécessaire de retirer les accents dans un texte ou un champs de données.
Récemment, j’ai eu à gérer une base de données RH de plusieurs milliers de lignes, où il existait un identifiant unique pour chaque employé, permettant d’identifier de manière sûre un employé en s’affranchissant des erreurs éventuelles de saisie dans les noms et prénoms avec des accents.
Mais lorsque j’ai souhaité comparer cette base à une autre base qui ne contenait que les noms et prénoms des employés, la clé unique était inutile, et donc j’ai dû baser l’analyse par employé en fonction de leur nom/prénom, et c’est là que les problèmes d’accents ont commencé…
Comment donc remplacer TOUS les accents de manière automatique dans Excel ?
Voici 2 méthodes, l’une basée sur une fonction VBA à utiliser comme n’importe quelle formule dans votre classeur Excel, et l’autre basée sur PowerQuery pour traiter une base de données en masse.
Option Explicit Function fnSupprAccents(texte As String) Dim i As Long Dim A As String, B As String, str As String Const AccChars = "ŠŽšžŸÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðñòóôõöùúûüýÿ" Const RegChars = "SZszYAAAAAACEEEEIIIIDNOOOOOUUUUYaaaaaaceeeeiiiidnooooouuuuyy" str = texte For i = 1 To Len(AccChars) A = Mid(AccChars, i, 1) B = Mid(RegChars, i, 1) str = Replace(str, A, B) Next fnSupprAccents = str End Function
La macro VBA recherche pour chaque caractère accentué du texte, le caractère non accentué correspondant, et retourne le texte sans les accents.
Ensuite, dans Excel, mettez-vous dans une cellule, et insérez la formule suivante :
=fnSupprAccents(A1)
avec A1, la référence à une cellule contenant du texte accentué.
Voilà, c’est très simple !
Requête PowerQuery : supprimer les accents dans un champs de données
PowerQuery ne propose pas de fonction native pour supprimer les accents des caractères. Même si l’on transforme le texte en Majuscule, les accents restent.
Voici donc une requête PowerQuery pour remplacer les accents dans un champs de données.
On commence par créer une table de correspondance entre les caractères accentués et non accentués :
let AccChars = "ŠŽšžŸÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðñòóôõöùúûüýÿ", RegChars = "SZszYAAAAAACEEEEIIIIDNOOOOOUUUUYaaaaaaceeeeiiiidnooooouuuuyy", TableAcc = #table(1, {{AccChars}}), ExpandAcc = Table.ExpandListColumn(Table.TransformColumns(TableAcc, {{"Column1", Splitter.SplitTextByRepeatedLengths(1), let itemType = (type nullable text) meta [Serialized.Text = true] in type {itemType}}}), "Column1"), IndexAcc = Table.AddIndexColumn(ExpandAcc, "Index", 1, 1), TableReg = #table(1, {{RegChars}}), ExpandReg = Table.ExpandListColumn(Table.TransformColumns(TableReg, {{"Column1", Splitter.SplitTextByRepeatedLengths(1), let itemType = (type nullable text) meta [Serialized.Text = true] in type {itemType}}}), "Column1"), IndexReg = Table.AddIndexColumn(ExpandReg, "Index", 1, 1), Combine = Table.NestedJoin(IndexAcc, {"Index"}, IndexReg, {"Index"}, "Combine", JoinKind.LeftOuter), Dev = Table.ExpandTableColumn(Combine, "Combine", {"Column1"}, {"Combine.Column1"}), Source = Dev, Permute = Table.ReorderColumns(Source,{"Column1", "Combine.Column1", "Index"}), Rename = Table.RenameColumns(Permute,{{"Column1", "AccChar"}, {"Combine.Column1", "RegChar"}}) in Rename
Puis on créé une fonction de conversion utilisant la table de correspondance :
- Prendre le texte à convertir en argument
- Décomposer le texte dans une table avec un caractère par ligne, sur une colonne
- Ajouter une colonne d’index définissant l’ordre des caractères
- Effectuer une jointure gauche entre la table du texte et la table de correspondance, pour récupérer la version non accentuée de chaque caractère
- Remettre les caractères dans l’ordre en triant selon la colonne d’index
- Conserver uniquement la colonne des caractères sans accents
- Combiner les lignes en un seul texte
Le code de la fonction est le suivant :
(Texte as text) => let Source = Texte, ToTable = #table(1, {{Source}}), SplitbyCharacter = Table.ExpandListColumn(Table.TransformColumns(ToTable, {{"Column1", Splitter.SplitTextByRepeatedLengths(1), let itemType = (type nullable text) meta [Serialized.Text = true] in type {itemType}}}), "Column1"), AddIndex = Table.AddIndexColumn(SplitbyCharacter, "Index", 1, 1), JoinAccReg = Table.NestedJoin(AddIndex, {"Column1"}, R_AccRegChar, {"AccChar"}, "R_AccRegChar", JoinKind.LeftOuter), DevAccReg = Table.ExpandTableColumn(JoinAccReg, "R_AccRegChar", {"RegChar"}, {"RegChar"}), ToRegCol = Table.AddColumn(DevAccReg, "Personnalisé", each if [RegChar] = null then [Column1] else [RegChar]), Tri = Table.Sort(ToRegCol,{{"Index", Order.Ascending}}), SelectCol = Table.SelectColumns(Tri,{"Personnalisé"}), ToRegText = Text.Combine(Table.ToList(SelectCol)) in ToRegText
Enfin, on appelle cette fonction dans la requête à transformer :
👇 Téléchargez le fichier Excel en exemple pour récupérer la macro VBA et la requête PowerQuery !
📥Téléchargement
Téléchargez le classeur Excel pour ce tutoriel. Seuls votre adresse e-mail et nom vous seront demandés dans la prochaine étape. Vous recevrez le lien de téléchargement par e-mail.
Supprimer les accents
Envoyer le lien de téléchargement à :
Maîtrisez l’essentiel des formules Excel
Enfin, transformez-vous en Expert d’Excel. Devenez un membre essentiel de votre équipe qui obtient des résultats rapidement. Obtenez une sécurité de l’emploi et une mobilité ascendante imbattable. Tout ce qu’il vous faut, c’est construire à partir de vos connaissances actuelles d’Excel, étape par étape. Pour cela, rejoignez le programme 👏👏 :
🥇 FORMULES EXCEL ULTIMES (2 MODULES OFFERTS)