Microsoft 365 formules pour remplacer les caractères "st" et "ste" en début de chaine de texte ou dans la chaine si séparés par 1 espace avant et 1 espace après

Usine à gaz

XLDnaute Barbatruc
Supporter XLD
Re-Bonjour à toutes et à tous,

Me voilà devant un nouveau souci :mad:

Pour mon fichier communes de France, environ 40000 communes, j'ai besoin de remplacer les caractères "st" et "ste" en début de chaine de texte ou dans la chaine si séparés par 1 espace avant et 1 espace après.
Pour le début de chaine, pas de souci.

Mais voilà avec ma formule actuelle en colonne "E" du fichier test joint, tous les st ou ste, où qu'ils soient positionnés dans la chaine sont remplacés par "saint" ou "sainte".
Evidemment, cela me change les noms des communes et ça ne fait pas mon affaire lol ou plutôt pas lol du tout :mad:

A l'instant, malgré mes recherches et tentatives, je n'ai pas trouvé la solution.
Auriez-vous la bonne formule ?
Fichier test joint,

Je continue mes recherches.
A grand merci par avance,
Amicalement,
lionel,
 

Pièces jointes

  • formule_test.xlsx
    13.9 KB · Affichages: 10
Solution
Bonsoir Lionel, Chris401, laurent950,

Le VBA est superflu ici.

Décortique cette formule en C6, elle n'est pas trop compliquée :
Code:
=SUPPRESPACE(SUBSTITUE(SUBSTITUE(" "&A6;" ste ";" sainte ");" st ";" saint ")&" ("&TEXTE(B6;"00000")&")")
A+

laurent950

XLDnaute Accro
ça à l'ai super bien mais comment modifier pour le code traite toutes les lignes jusqu'à la dernière ligne NON VIDE ?
Actuellement de la ligne 6 à la ligne 25 mais ça ira au moins jusqu'à 40000 lignes
Set Rgn = Range(Cells(6, 3), Cells(Cells(65536, 3).End(xlUp).Row, 3))
Range
Cells(6, 3) C'est la cellule Ligne 6 Colonne 3 soit C6
Cells(65536, 3).End(xlUp).Row = C'est la derniere cellule non vide de la colonne 3 (Le Numéro de la ligne)

C'est la colonne 3 soit la colonne C
Et donc

Cells(Le numéro de la derniere ligne non vide de la colonne 3, C'est la colonne 3))
et donc
Range(la plage de la cellule C6 à la dernière cellule non vide de la colonne C)

40000 lignes je vais jusqu'à 65536
 

job75

XLDnaute Barbatruc
Si tu veux appliquer la formule sur les lignes vides également utilise la fonction REPT, en C6 :
Code:
=SUPPRESPACE(SUBSTITUE(SUBSTITUE(" "&A6;" ste ";" sainte ");" st ";" saint ")&REPT(" ("&TEXTE(B6;"00000")&")";B6<>""))
 

Pièces jointes

  • formule_test(2).xlsx
    14 KB · Affichages: 2

laurent950

XLDnaute Accro
lol mais j'ai joint le fichier :)
lignes à traiter de la 6 à la 25
Re @Usine à gaz

Replace avec Mutli Critères "st" ou "ste" a l'aide d'une Regex.

J'ai modifier pour la prise en compte des compléments des lignes qui ne correspondent pas a "st" et "ste" pour les recopier dans la colonne C

VB:
Option Explicit
Sub test()
Dim Rgn As Range
     Set Rgn = Range(Cells(6, 3), Cells(Cells(65536, 3).End(xlUp).Row, 3))
Dim cel As Range
Dim NewCommune As String

Dim Match As Object
Dim Matches As Object
Dim StrPattern As String
Dim reg As Object
        Set reg = CreateObject("VBScript.RegExp")
    StrPattern = "(^\s(ste)\s)|(^(ste)\s)|(\s(ste)\s)|(\s(ste)\s$)|(^\s(st)\s)|(^(st)\s)|(\s(st)\s)|(\s(st)\s$)"
    reg.Pattern = StrPattern
    reg.MultiLine = True: reg.IgnoreCase = False: reg.Global = True
    For Each cel In Rgn
        Set Matches = reg.Execute(cel.Value)
        If reg.Execute(cel.Value).Count >= 1 Then
            For Each Match In Matches
                NewCommune = reg.Replace(cel.Value, " saint ")
                cel.Offset(, 2).Value = Trim(NewCommune)
            Next Match
        Else
            cel.Offset(, 2).Value = Trim(cel.Value)
        End If
    Next cel
 
' libération d'objets
    Set Matches = Nothing
    Set Match = Nothing
    Set reg = Nothing
    Set Rgn = Nothing
    Set cel = Nothing
    NewCommune = Empty
End Sub
 
Dernière édition:

laurent950

XLDnaute Accro
lol maintenant Mais il me remplace tout par saint et pas les "ste" par sainte.
@Usine à gaz

J'ai amélioré : "st" = "saint" et pour "ste" = "sainte"

VB:
Option Explicit
Sub test()
Dim Rgn As Range
     Set Rgn = Range(Cells(6, 3), Cells(Cells(65536, 3).End(xlUp).Row, 3))
Dim cel As Range
Dim NewCommune As String
Dim Str As String

Dim Match As Object
Dim Matches As Object
Dim StrPattern As String
Dim reg As Object
        Set reg = CreateObject("VBScript.RegExp")
    StrPattern = "(^\s(ste)\s)|(^(ste)\s)|(\s(ste)\s)|(\s(ste)\s$)|(^\s(st)\s)|(^(st)\s)|(\s(st)\s)|(\s(st)\s$)"
    reg.Pattern = StrPattern
    reg.MultiLine = True: reg.IgnoreCase = False: reg.Global = True
    For Each cel In Rgn
        Set Matches = reg.Execute(cel.Value)
            If reg.Execute(cel.Value).Count >= 1 Then
                For Each Match In Matches
                    If Trim(Match.Value) = "ste" Then
                        Str = "sainte"
                    ElseIf Trim(Match.Value) = "st" Then
                        Str = "saint"
                    End If
                        NewCommune = reg.Replace(cel.Value, " " & Str & " ")
                        cel.Offset(, 2).Value = Trim(NewCommune)
                        Str = Empty
                Next Match
            Else
                cel.Offset(, 2).Value = Trim(cel.Value)
            End If
    Next cel
 
' libération d'objets
    Set Matches = Nothing
    Set Match = Nothing
    Set reg = Nothing
    Set Rgn = Nothing
    Set cel = Nothing
    Str = Empty
    NewCommune = Empty
End Sub
 

Discussions similaires

Réponses
34
Affichages
4 K

Statistiques des forums

Discussions
312 185
Messages
2 086 011
Membres
103 093
dernier inscrit
Molinari