<p><em><strong>MODIFICATION du 22/03/2022</strong></em> :</p>
<p>Avec les nouvelles fonctionnalités, vous pouvez opter pour :</p>
<pre><code class="lang-auto">=CONCAT(TEXTSPLIT(A1,{"+","#","%","*","(",")","!"}))
</code></pre>
<p>Je garde la réponse originale utilisant <code>LAMBDA()</code> intacte ci-dessous :</p>
<p><em><strong>Réponse originale</strong></em> :</p>
<p>Créons un exemple de chaîne à nettoyer : <code>a+b#c%de(f)g!h</code>.</p>
<p><a href="https://i.sstatic.net/pMgXT.png"></a></p>
<p>Formule dans <code>B1</code> :</p>
<pre><code class="lang-auto">=SUBALL(A1,"+#%()!","")
</code></pre>
<p>Où <code>SUBALL()</code> est le nom de notre fonction <code>LAMBDA()</code> que j’ai créée via le menu « Gestionnaire de noms » et qui se lit comme suit :</p>
<pre><code class="lang-auto">=LAMBDA(str,chrs,sub,IF(chrs="",str,SUBALL(SUBSTITUTE(str,LEFT(chrs),sub),RIGHT(chrs,LEN(chrs)-1),"")))
</code></pre>
<p>Le coeur de cette formule repose sur 3 variables :</p>
<ul>
<li>
<p><code>str</code> - Une référence à la chaîne à nettoyer.</p>
</li>
<li>
<p><code>chrs</code> - Une chaîne de caractères à substituer.</p>
</li>
<li>
<p><code>sub</code> - Par quoi voulons-nous remplacer nos caractères ?</p>
</li>
</ul>
<p>Le 4e paramètre est un <code>IF()</code> imbriqué. En raison des appels récursifs, nous avons besoin d’un moyen de sortir d’une boucle autrement infinie. Nous testons donc si <code>chrs=""</code>. Si <code>VRAI</code>, nous retournons la chaîne finale avec tous les caractères substitués. Si <code>FAUX</code>, nous appelons la fonction <em>à nouveau</em>. L’avantage ici est que nous pouvons modifier toutes les variables ! C’est important car nous pouvons ainsi effectuer un <code>SUBSTITUTE()</code> sur le caractère le plus à gauche <em>et</em> nous pouvons supprimer ce même caractère de la chaîne de remplacement.</p>
<p>Nous pourrions aussi aller plus loin et remplacer des éléments d’un tableau. Par exemple :</p>
<p><a href="https://i.sstatic.net/b5bBP.png"></a></p>
<p>La formule dans <code>B1</code> :</p>
<pre><code class="lang-auto">=SUBALL(A1,{"STR1","STR2","STR3"},"-")
</code></pre>
<p>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é :</p>
<pre><code class="lang-auto">=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)))
</code></pre>
<p>Le coeur de la fonction reste le même, mais comme mentionné, nous utilisons maintenant un tableau. Notre <code>IF()</code> ne vérifiera donc plus une valeur vide,</p>
<p><em>(Réponse tronquée)</em></p>