Excel - Comment remplacer plusieurs caractères ou mots entiers dans une cellule en utilisant LAMBDA()

Excel - Comment remplacer plusieurs caractères ou mots entiers dans une cellule en utilisant LAMBDA()


Source : Stack Overflow [office365]

MODIFICATION du 22/03/2022 :

Avec les nouvelles fonctionnalités, vous pouvez opter pour :

=CONCAT(TEXTSPLIT(A1,{"+","#","%","*","(",")","!"}))

Je garde la réponse originale utilisant LAMBDA() intacte ci-dessous :

Réponse originale :

Créons un exemple de chaîne à nettoyer : a+b#c%d*e(f)g!h.

Formule dans B1 :

=SUBALL(A1,"+#%*()!","")

SUBALL() est le nom de notre fonction LAMBDA() que j’ai créée via le menu « Gestionnaire de noms » et qui se lit comme suit :

=LAMBDA(str,chrs,sub,IF(chrs="",str,SUBALL(SUBSTITUTE(str,LEFT(chrs),sub),RIGHT(chrs,LEN(chrs)-1),"")))

Le coeur de cette formule repose sur 3 variables :

  • str - Une référence à la chaîne à nettoyer.

  • chrs - Une chaîne de caractères à substituer.

  • sub - Par quoi voulons-nous remplacer nos caractères ?

Le 4e paramètre est un IF() imbriqué. En raison des appels récursifs, nous avons besoin d’un moyen de sortir d’une boucle autrement infinie. Nous testons donc si chrs="". Si VRAI, nous retournons la chaîne finale avec tous les caractères substitués. Si FAUX, nous appelons la fonction à nouveau. L’avantage ici est que nous pouvons modifier toutes les variables ! C’est important car nous pouvons ainsi effectuer un SUBSTITUTE() sur le caractère le plus à gauche et nous pouvons supprimer ce même caractère de la chaîne de remplacement.

Nous pourrions aussi aller plus loin et remplacer des éléments d’un tableau. Par exemple :

La formule dans B1 :

=SUBALL(A1,{"STR1","STR2","STR3"},"-")

Notez que vous pouvez aussi coder en dur une seule valeur ou référencer une seule cellule (ou n’importe quelle plage verticale d’ailleurs). Évidemment, cela impactera la façon dont nous gérons la récursion. Il y a peut-être une manière plus élégante, mais voici ce que j’ai trouvé :

=LAMBDA(str,del,sub,IF(COUNTA(del)=1,SUBSTITUTE(str,@del,sub),SUBALL(SUBSTITUTE(str,@del,sub),INDEX(del,SEQUENCE(COUNTA(del)-1,,2)),sub)))

Le coeur de la fonction reste le même, mais comme mentionné, nous utilisons maintenant un tableau. Notre IF() ne vérifiera donc plus une valeur vide,

(Réponse tronquée)