Résolu Microsoft 365 remplacer caractères

Usine à gaz

XLDnaute Barbatruc
Supporter XLD
Bonjour à toutes et à toutes,
Je vous souhaite un bon et beau WE :)

Je bute encore une fois sur un codage que je n'arrive pas à faire.
Et je me permets de vous solliciter à nouveau.
Contexte
Nos Clients ou nvx Clients nous envoient par mail des listes de communes à prospecter.
Afin de ne pas prospecter les communes pour trop de Clients, je vérifie les communes que nous avons déjà en prospection.
Pour cela j'ai un classeur, avec un code fait avec l'enregistreur de macro, pour remplacer le maximum de cas rencontrés, qui va pas trop mal lol

Les Clients m'envoient leurs communes en écritures diverses et variées LOL
Pour que je puisse vérifier dans mon classeur, il est impératif que les communes comparées soient "rigoureusement" nommées à l'identique.

Toutefois, c'est incomplet, je gère plus de 4000 communes et je suis trop souvent obligé de passer bcp de temps pour vérifier manuellement.

J'ai obtenu de je ne sais plus qui du forum un code (mes excuses pour l'avoir oublié et mes remerciements à nouveau) qui fonctionne très bien pour certains remplacements de caractères :
VB:
Function Sans_accents(chaine As Range)
   Dim T As String, A As String, B As String
   Dim i As Integer, U As String
   If chaine.Value = "" Then Exit Function
   T = chaine.Value
   'remplacement des caractères accentués
   A = "ÀÁÂÃÄÅÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝàáâãäåèéêëìíîïðñòóôõöùúûüýÿçÇ"
   B = "AAAAAAEEEEIIIINOOOOOUUUUYaaaaaaeeeeiiiionooooouuuuyycC"
   For i = 1 To Len(T)
      U = InStr(1, A, Mid(T, i, 1), 0)
      If U Then Mid(T, i, 1) = Mid(B, U, 1)
   Next i
   Sans_accents = T
End Function
Malheureusement, j'ai d'autres remplacements à faire et je n'arrive pas à trouver comment faire le code
exemple :
8400 ardeuil-a-montfauxelles
8400 ardeuil_a_montfauxelles

Résultats attendus
8400 ardeuil a montfauxelles
8400 ardeuil a montfauxelles

etc...

J'ai fait un fichier test dans lequel :
- en colonne A (a4 à a38) j'ai listé les noms de communes à modifier,
- en colonne D j'ai listé les résultats attendus,

Auriez-vous la solution ?
Cela me ferait gagner un temps considérable.
Je joins le fichier test,
Avec mes remerciements,
lionel,
 
Ce fil a été résolu! Aller à la solution…

Fichiers joints

Dernière édition:

Pounet95

XLDnaute Occasionnel
Bonjour,
En retour le fichier avec une fonction Sans_accents_2
En prime, une feuille avec la liste des communes françaises pour vérifier le nom exact.
La recherche sur le code INSEE donne beaucoup de réponse pour l'exemple proposé, mais avec filtre ça devrait être rapide quand même

Claude alias Pounet95
 

Fichiers joints

Pounet95

XLDnaute Occasionnel
Re,
Effectivement, il n'y a pas qu'un caractère qui doit changer ou être remplacé.
les espaces entre noms doivent rester, un espace entre une apostrophe et une autre lettre doit être effacé. De même il faut traiter les cas de st (saint) ste (sainte), s (ou / )pour sous ou sur ?
C'est bien plus complexe d'où mon idée de joindre la liste des communes avec code insee

En ce qui concerne le code, je me sers du code ASCII de chaque caractère et de son pendant CHR
Exemple pour A le code ASCII est 65 et CHR(65) donne A

Dis-moi si tu veux que j'aille plus loin ET/OU qu'un des nombreux officiants sur ce forum y mette aussi les doigts. Je n'en serais aucune vexé.

Claude
 

Usine à gaz

XLDnaute Barbatruc
Supporter XLD
Merci Pounet95 pour m'avoir répondu :)
Je crois que c'est très ardu mais ce serait super

D'une part en modifiant les caractères :
A = "ÀÁÂÃÄÅÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝàáâãäåèéêëìíîïðñòóôõöùúûüýÿçÇ"
remplacement :
B = "AAAAAAEEEEIIIINOOOOOUUUUYaaaaaaeeeeiiiionooooouuuuyycC"

+ tous mes cas répertoriés = Résultats souhaités en colonne D
VB:
8400 ardeuil-a-montfauxelles
8400 ardeuil_a_montfauxelles

8400 ardeuil-aux-montfauxelles
8400 ardeuil_aux_montfauxelles

8400 ardeuil d' amont
8400 ardeuil-d' amont
8400 ardeuil_d' amont

8400 ardeuil l' amont
8400 ardeuil-l'amont
8400 ardeuil_l'amont

8400 ardeuil-de-montfauxelles
8400 ardeuil_de_montfauxelles

8400 ardeuil-des-montfauxelles
8400 ardeuil_des_montfauxelles

8400 ardeuil-du-montfauxelles
8400 ardeuil_du_montfauxelles

8400 ardeuil-et-montfauxelles
8400 ardeuil_et_montfauxelles

8400 ardeuil-en-montfauxelles
8400 ardeuil_en_montfauxelles

8400 ardeuil-la-montfauxelles
8400 ardeuil_la_montfauxelles

8400 ardeuil-le-montfauxelles
8400 ardeuil_le_montfauxelles

8400 ardeuil-les-montfauxelles
8400 ardeuil_les_montfauxelles

8400 st ardeuil les montfauxelles
8400 ste ardeuil les montfauxelles

8400 ardeuil s/montfauxelles
8400 ardeuil s/ montfauxelles

8400 ardeuil-s/montfauxelles
8400 ardeuil_s/ montfauxelles

8400 ardeuil-vers-montfauxelles
8400 ardeuil_vers_montfauxelles
Je remets le fichier test que j'ai modifié,
lionel :)
 

Fichiers joints

Dernière édition:

BrunoM45

XLDnaute Barbatruc
Bonjour le fil

Voici la fonction corrigée ;)
VB:
Function Sans_Accent(Chaine As String)
  Dim Avec As String, Sans As String
  Dim Ind As Integer, PosAcc As Integer
  If Chaine = "" Then Exit Function
  ' Liste des caractères accentués
  Avec = "ÀÁÂÃÄÅÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝàáâãäåèéêëìíîïðñòóôõöùúûüýÿçÇ_-/"
  ' Liste des caractères sans accent
  Sans = "AAAAAAEEEEIIIINOOOOOUUUUYaaaaaaeeeeiiiionooooouuuuyycC   "
  ' Pour toute la longueur de la chaine
  For Ind = 1 To Len(Chaine)
    ' Recherche dans la liste accentuée, le caratère de la chaine en position Ind
    PosAcc = 0: PosAcc = InStr(1, Avec, Mid(Chaine, Ind, 1))
    ' Si le caratère est trouvé
    If PosAcc > 0 Then
      ' LE remplacer par sa correspondance sans accent
      Chaine = Replace(Chaine, Mid(Avec, PosAcc, 1), Mid(Sans, PosAcc, 1))
    End If
  Next Ind
  ' Retourner la valeur de la fonction
  Sans_Accent = Chaine
End Function
@+
 

Usine à gaz

XLDnaute Barbatruc
Supporter XLD
Re, j'ai oublié de te dire que mes Clients n'envoient jamais de codes insee ... mais des codes postaux et des noms de communes provenant de toutes sources sur le net et plus bizarres les uns que les autres LOL ... mais pas drôle du tout pour travailler :)
 

Usine à gaz

XLDnaute Barbatruc
Supporter XLD
Re-Bonjour BrunoM45,
Rectification, je me suis planté j'avais pas vu que tu avais enlevé le S de "Sans_Accents".
Super, ça fonctionne nickel :)
Un très grand merci :)

Juste les :
8400 st ardeuil les montfauxelles
8400 ste ardeuil les montfauxelles
8400 ardeuil s/montfauxelles
8400 ardeuil s/ montfauxelles
8400 ardeuil-s/montfauxelles
8400 ardeuil_s/ montfauxelles
Ne sont pas traités si ce n'est pas possible de les inclure dans le code, je peux faire un second code juste pour eux avec :
Selection.Replace What:="st", Replacement:="saint", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
etc...
Lionel :)
 

Usine à gaz

XLDnaute Barbatruc
Supporter XLD
Re-Bonjour BrunoM45,

Evidemment je pige "que couic" à ton code et je me pose une question.
Si on m'invente une appellation d'une commune, par exemple :
8400 ardeuil_trou duc_montfauxelles
veux-tu me dire comment je l'ajoute dans le code ?
pour obtenir : 8400 ardeuil montfauxelles
Merci,
lionel :)
 
Dernière édition:

BrunoM45

XLDnaute Barbatruc
Re,

Voilà le fichier modifier pour traiter les cas de ton post #12

Pour ce qui est du "_" c'est déjà traité dans la partie "Avec" et est remplacé par un espace ;)

Nota : tout caractère unique que tu ne voudrais pas, il suffit de l'ajouter à la liste "Avec" et tu mets dans la liste "Sans" le caractère de remplacement

@+
 
Ce message a été identifié comme étant une solution!

Fichiers joints

Pounet95

XLDnaute Occasionnel
Re,
Il y a, avec la liste des communes jointe, moyen de faire un filtre élaboré (avancé) et de chercher un nom de ville, commune, village au moins approchant.
Ca permettra d'éviter de tenter une "normalisation" d'un n'importe quoi ( ton exemple .. par exemple)

Au passage , merci Bruno
Par contre il y a toujours le "d' " ou le "l' " ainsi que les cas st, ste, sur !!!!!
Il va falloir autant de ligne que de communes pour traiter les cas. Compris sur la version à l'instant !
Claude
 

BrunoM45

XLDnaute Barbatruc
Re,

Désolé, de mettre immiscé comme ça dans la conversation mais je n'ai pas tout suivi :p
quel est le problème avec d' et l' ?

st, ste et sur sont traités

@+
 

Pounet95

XLDnaute Occasionnel
Bonsoir,
Ne sois pas désolé, j'étais demandeur d'une telle intervention ! (post #6 )
Il y a un espace entre le début du nom et l'apostrophe : ' je figure avec underscore en bleu)
au lieu d'avoir mordeuil d'amont par exemple, le résultat est mordeuil d'_amont
 

Usine à gaz

XLDnaute Barbatruc
Supporter XLD
Re(s) (désolé, j'étais sorti),
@BrunoM45 : la version du post #14 est nickel et c'est magique tous les cas sont traités et la partie du code :
Avant = "st ,ste ,s/ ,s/,d' ,l' "
Après = "saint ,sainte ,sur ,sur ,d',l'"
Me permet d'ajouter de nouvelles modifications.

@Pounet95 : la liste des communes n'est pas nécessaire dans le fichier car il s'agit uniquement de comparer une liste de communes à une autre.
La version du post #14 de BrunoM45 a résolu les besoins (sauf erreur de ma part lol).

Merci à vous 2 d'avoir pris du temps pour m'aider :)
Bonne fin de dimanche,
lionel,
 

Pounet95

XLDnaute Occasionnel
Re,
Pour que ça fonctionne; et c'est le cas de la macro de Bruno, il reste une vérification à faire : comparer les résultats attendus et là, voir image !
Il faut donc modifier la source en colonne A ( enlever un espace derrière l'apostrophe car il y en a 2 )
Problème des caractères non visibles :)

Bon courage
Bonsoir à tous
Claude

Capture.PNG
 

BrunoM45

XLDnaute Barbatruc
Lionel,

Une autre version,

Il restait un petit bémol tout de même, j'ai changé la fonction et ajouté des communes de France pour te montrer

Edit : Tout à fait Pounet95, c'est pour cette raison et d'autres (gestion des majuscules) que j'ai modifié la fonction ;)

@+
 
Ce message a été identifié comme étant une solution!

Fichiers joints

Créez un compte ou connectez vous pour répondre

Vous devez être membre afin de pouvoir répondre ici

Créer un compte

Créez un compte Excel Downloads. C'est simple!

Connexion

Vous avez déjà un compte? Connectez vous ici.

Haut Bas