Remplacer un caractère et son précédent dans une chaine

Bonjour à tous,

J'aimerais savoir comment remplacer dans une chaîne de caractère un caractère précis et son précédent quel qu'il soit par un autre de mon choix.

par exemple dans ma cellule A1, j'ai une chaîne de ce type :

H1He1He1BeH2NHe2BH2MeMM3NeM4HHe2HeNHe3

et je voudrais remplacer tous les chiffres avec 1 caractère précédent si ce n'est pas un "e" ou avec les 2 précédents si le précédent est un "e" par un autre caractère "-"

ça donnerait :

- - - Be - N - B - Me M - Ne - H - HeN -

Sachant que les chiffres ne peuvent être compris qu'entre 1 et 4 j ai commencé par essayer =SUBSTITUE(SUBSTITUE(SUBSTITUE(SUBSTITUE(A1;"?e1";"-");"?e2";"-");"?e3";"-");"?e4";"-") mais ça ne fonctionne pas.

Merci d'avance pour votre aide,

Bonjour,

Je vous propose un essai avec une fonction personnalisée (que je n'ai pas pu tester car j'ai un mac) :

Il y a cependant quelques pré-requis :

- enregistrer le fichier au format .xlsm,
- activer le volet "Développeur" (si ce n'est pas déjà fait) : Volet "Fichier" / Options / Personnaliser le ruban > cocher "développeur",
- sur le volet "Développeur", ouvrir l'éditeur "Visual Basic" (raccourci Alt + F11),
- dans le menu contextuel "Insertion", sélectionner "Module",
- aller sur ce nouveau module et y copier le code,
- à partir du menu "Outils"/ Références, sélectionner la référence "Microsoft VBScript Regular Expressions 5.5"

Function REMPLACER_MODELE(chaine As String) As string

Dim ExpReg As REGEXP
Dim modele$

Set ExpReg = CreateObject("vbscript.regexp")
modele = "[^e]\d|.e\d" 'modele : tout caractère sauf e suivi d'un chiffre ou tout caractère suivi de e suivi d'un chiffre

With ExpReg
    .Global = True
    .Pattern = modele
    If .test(chaine) Then 'si correspondance trouvée dans la chaine
        REMPLACER_MODELE = .replace(chaine, "-") 'remplace toutes les correspondances par "-"
    Else
        REMPLACER_MODELE = chaine 'sinon, renvoie la chaine
    End If
End With

End function

Il est possible de remplacer \d (chiffre quelconque) par [1-4] si vous préférez.

Edit : Et il suffira en B1 de saisir la formule :

= REMPLACER_MODELE(A1)

Cdlt,

bonjour,

une proposition avec une fonction personnalisée

Function supHeedig(texte)
   t = ""
    For i = 1 To Len(texte)
        c = Mid(texte, i, 1)
        If c Like "#" Then
            If Mid(texte, i - 1, 1) = "e" Then
                If Len(t) > 2 Then t = Left(t, Len(t) - 2) & "-" Else t = "-"
            Else
            If Len(t) > 1 Then t = Left(t, Len(t) - 1) & "-" Else t = "-"
            End If
        Else
            t = t & c
        End If
    Next i
    supHeedig = t
End Function
3supheedig.xlsm (14.15 Ko)

Bonjour,

Merci pour vos réponses, je viens de tester la fonction de h2so4 qui fonctionne parfaitement.

Bravo à tous les 2 et encore merci.

Bonjour 3GB,

Je reviens vers toi car j'essaie de m'inspirer de ta solution pour remplacer dans ma chaine les 2 caractères précédents un "1" (ainsi que le "1") si il y a un "e" juste avant le "1" par un "x"

ou remplacer seulement le caractère précédent le "1" avec le "1" par un "a".

J'ai essayé de changer le \d par \1 mais ca n'a pas fonctionné, j'ai également essayé \[1] en vain.

Je n'ai vraiment aucune notion en vba, merci pour l'aide que tu voudras bien m'apporter et si tu pouvais m'expliquer ca serait encore mieux.

Merci

Bonjour,

Voici une solution, probablement à améliorer en cas de complexification...

Function REMPLACER_MODELE(chaine As String) As string

Dim ExpReg As REGEXP
Dim modele$, modele1$, modele2$

Set ExpReg = CreateObject("vbscript.regexp")
modele1 = ".e1" 'modele : tout caractère suivi de e suivi d'un chiffre
modele2 = "[^e]1" 'tout caractères sauf e suivi d'un 1
REMPLACER_MODELE = chaine

With ExpReg
    .Global = True
    .Pattern = modele1
    If .test(REMPLACER_MODELE) Then 'si correspondance trouvée dans la chaine
        REMPLACER_MODELE = .replace(REMPLACER_MODELE, "x") 'remplace toutes les correspondances par "-"
    End If
    .pattern = modele2
    if .test(REMPLACER_MODELE) then
        REMPLACER_MODELE = .replace(REMPLACER_MODELE, "a1")
    end if
End With

End function

Edit : j'ai modifié le code car j'avais fait une erreur en répondant trop vite.

Quelles explications voudrais-tu précisément ?

En tout cas, "\d" représente la classe des caractères numériques, c'est l'équivalent de [0-9]. Pour ne tester qu'un chiffre, on peut le saisir normalement.

Cdlt,

Re 3GB,

Il doit y avoir un souci quelque part, ca m'indique ce message d'erreur :

erreur de compilation

Type défini par utilisateur non défini

Ca me surligne en jaune : Function REMPLACER_MODELE(chaine As String) As String

et en bleu juste en dessous : ExpReg As REGEXP

Re,

Est-ce que tu as essayé la première fonction déjà ? Car il faut bien ajouter la référence "Microsoft VBScript Regular Expressions 5.5" via Outils/Références.

Si ce n'est pas ça, je regarderai de plus près...

Cdlt,

Bonsoir,

pour éviter de devoir mettre la référence dans vbe,

remplace

Dim ExpReg As REGEXP

par

Dim ExpReg As Object

Bonjour à tous,

@3GB, j'avais effectivement oublier d'ajouter la référence "Microsoft VBScript Regular Expressions 5.5" via Outils/Références. Du coup, après l'avoir fait, cela fonctionne.

@h2so4, après avoir ajouter la référence ci-dessus, j'ai essayé avec Dim ExpReg As REGEXP et aussi avec Dim ExpReg As Object, je pense qu'il n' y a pas de différence sur le résultats et les 2 options fonctionne dans mon cas.

Merci à tous les 2.

Je suis content d'avoir un retour positif.

En fait, l'ajout de la référence et la déclaration de la variable au type REGEXP permettent d'accéder aux propriétés et méthodes de l'objet. Si jamais vous désiriez découvrir un peu, vous n'avanceriez pas dans l'ombre totale...

bonjour

@h2so4, après avoir ajouter la référence ci-dessus, j'ai essayé avec Dim ExpReg As REGEXP et aussi avec Dim ExpReg As Object, je pense qu'il n' y a pas de différence sur le résultats et les 2 options fonctionne dans mon cas.

la solution proposée évite d'avoir à mettre la référence en vbe. VBA reconnait REGEXP si la référence est mise, et génère une erreur dans le cas contraire. (erreur que tu as reçue).

Si tu as mis la référence, les 2 syntaxes ne provoqueront pas d'erreur.

Rechercher des sujets similaires à "remplacer caractere precedent chaine"