Supprimer des caractères dans une chaîne

Bonjour à tous.

Je suis un quadra résidant dans le Sud-Ouest et je viens de débuter en VBA: je trouve cela super intéressant.

Je maudis les ingés qui ont eu la bonne idée d'orthographier les classes et les objets de façon identique et j'ai toujours du mal à savoir quand mettre un s à la fin de worksheet ou non (ce qui signifie que les concepts de la programmation orientée objet ne sont pas complètement acquis).

Mais ce n'est pas le propos ici.

J'ai bien compris comment écrire ma variable d'accumulation pour une string mais je ne vois pas comment faire l'inverse.

Par exemple, j'ai une chaîne F9999M001 que je concatène avec une chaîne F9999M002 et ainsi de suite jusqu'à F9999M004 puis une dernière à F9999M025.

J'ai besoin de concaténer tout ceci dans ma macro et j'obtiens facilement:

F9999M001/F9999M002/F9999M003/F9999M004/F9999M025

Un peu plus loin, dans ma macro, j'ai besoin de "dé-concaténer" cette chaîne.

J'ai passé des heures sur google et tous les fils, portaient sur la suppression d'un caractère répetitif ou bien la suppression d'un nombre de caractères en début ou en fin de chaîne, toujours à la même position.

Ce qui m'intéresse, dans le VBA, c'est de faire des macros "dynamiques": j'entends par là, le fait que tout est toujours variable.

Ainsi, F9999M001 pourrait avoir 2 ou 3 digits de plus.

Pour résoudre mon problème, j'ai utilisé la fonction split avec un tableau, mais je me demandais s'il n'y avait pas moyen de soustraire les caractères que je souhaite (sans aucune cohérence) dans ma chaîne.

J'ai toutes les variables nécessaires pour déterminer les positions et le nombre de caractères à supprimer mais je ne sais pas comment "soustraire".

La fonction Mid me conviendrait, mais elle ne veut pas remplacer mes chaînes par "": rien à faire !

Je suis obligé d'utiliser des subterfuges qui alourdissent ma macro.

Ainsi dans la string F9999M001/F9999M002/F9999M003/F9999M004/F9999M025, je souhaite récupérer F9999M001 mais pas seulement je souhaite que ma nouvelle variable ait la valeur:

F9999M002/F9999M003/F9999M004/F9999M025 en s'aidant uniquement des positions et pas de la régularité du nb de caractères à supprimer et les slashs.

Est-ce possible ?

Pourquoi la fonction Mid ne prend pas les "" ?

En gros, pour accumuler, j'ai cela:

nom = nom & "/" & nomConcat dans une boucle pour accumuler et j'aimerais savoir si une formulation analogue existe pour faire l'inverse...

Merci d'avance pour vos lumières.

Bonne soirée.

bonsoir

je pense que l'instruction InStr devrait servir pour la premiere partie associé a un left et un replace pour la deuxième partie

fred

Bonjour Fred.

Merci pour votre réponse.

Dans ma macro, j'utilise bien les fonctions InStr, Mid, Len , Replace mais ni left, ni right.

Peut-être auriez-vous une idée sur le fait que je ne puisse pas utiliser "" avec Mid ?

Pour palier à ce "manque", j'ai dû remplacer mon caractère par un espace puis rechercher cet espace pour le supprimer.

Voici un extrait de ma macro qui recherche les voyelles d'un mot, en partant de la fin, puis qui la supprime.

 If nbCaracKwd > 8 Then 'teste si le nb de digits du kwd généré est > à 8

'boucle pour balayer les 8 caractères afin de trouver une voyelle, en partant de la fin
For j = nbCaracKwd To 1 Step -1
lettreKwd = Mid(kwdDraft, j, 1) 'récupère la lettre trouvée dans la variable
    If lettreKwd = "A" Or lettreKwd = "E" Or lettreKwd = "I" _
    Or lettreKwd = "O" Or lettreKwd = "U" Or lettreKwd = "Y" Then ' Recherche une voyelle majuscule
    Mid(kwdDraft, j, 1) = " " '   (1)   remplace la voyelle trouvée par un espace
    kwdDraft = Replace(kwdDraft, " ", "") '   (2)    remplace l' espace par rien (= suppression espace)
    nbCaracKwd = Len(kwdDraft) 'récupère le nb de digits dans la variable nbCaracKwd en cours
        If nbCaracKwd = 8 Then
        ActiveSheet.Cells(iRows, i).Value = kwdDraft
        Exit For
        End If
    End If
Next

On peut voir que les lignes numerotées 1 et 2 (dans les commentaires) auraient pu être remplacées par:

Mid(kwdDraft, j, 1) = "" ' remplace la voyelle trouvée par rien

Bon ce n'est pas la mort de rajouter une ou deux lignes en plus mais je trouvais cela pratique.

Surtout que des fils trouvés ça et là le préconisent...

Bonne journée.

bonjour

pour :

Ainsi dans la string F9999M001/F9999M002/F9999M003/F9999M004/F9999M025, je souhaite récupérer F9999M001 mais pas seulement je souhaite que ma nouvelle variable ait la valeur:

F9999M002/F9999M003/F9999M004/F9999M025

voici 2 propositions :

'1e manière de faire
chaine_reste = Mid(chaine_source, InStr(1, chaine_source, "/") + 1)
extraction = Replace(chaine_source, "/" & chaine_reste, "")

'2e maniere de faire :
tableau = Split(chaine_source, "/")
extraction = tableau(0)
chaine_reste = Replace(chaine_source, tableau(0) & "/", "")

donc extracation = F9999M001

chaine_reste = F9999M002/F9999M003/F9999M004/F9999M025

pour :

nom = nom & "/" & nomConcat dans une boucle pour accumuler et j'aimerais savoir si une formulation analogue existe pour faire l'inverse

'pour deconcaténer on peut utiliser la fonction split qui met dans une variable tableau tous les éléments un par un a partir d'un séprateur
'attention un tabelau commence à 0 et non pas à 1
tableau = Split(chaine_source, "/")
'petite boucle qui affiche le contenu de la varaible tabelau pour vérification des données enregistrées:
For i = 0 To UBound(tableau)
MsgBox tableau(i)
Next

pour supprimer toutes les lettres ou symbole dans une variable

exemple : suppression de toutes les lettres "M" contenues dans la variable chaine source

resultat = replace(chaine_source,"M","")

fred

122pipout64-v001.xlsm (14.92 Ko)

Bonjour Fred.

Génial !

Les 2 propositions me conviennent parfaitement !

J'avais réalisé le stockage dans un tableau mais pas la chaîne_reste.

Pour le reste, j'avais eu l'occasion de trouver la même chose grâce à mes pérégrinations sur le net.

Quant au replace, je me suis mal exprimé, mais je souhaitais justement ne pas l'utiliser car je ne cherchais à supprimer qu'une seule lettre ou symbole dans une chaîne même si elle était présente plusieurs fois.

J'ai par exemple le mot "CONSTITUSTION": je dois faire en sorte que cette chaîne ne fasse que 8 digits "de long".

La règle c'est de supprimer toutes les voyelles en partant de la fin jusqu'à ce que le mot fasse 8 digits.

Dans ce cas précis le résultat est "CONSTTTN" et je ne peux pas utiliser la fonction "Replace" car elle me supprimerait les deux "O".

Donc j'ai trouvé très lourd de devoir, à chaque fois que je rencontrais une voyelle, de la remplacer par un espace puis de supprimer cet espace.

D'où mon :

Mid(kwdDraft, j, 1) = ""

Qui ne fonctionne pas...

Quoi qu'il en soit, merci pour votre célérité et le temps passé pour moi.

Bonne journée !

bonjour

la fonction mid ne fonctionne pas ainsi...

la fonction renvoi une valeur, on ne peut pas faire dans ce sens la (à ma connaissance)

on ne peut pas faire ceci : mid(chaine,i) = XXXXX

mais ceci : toto = mid(chaine,i)

exemple d'utilisation :

'5 est la position du caractère qui marque le début de la partie à extraire

'et 2 correspond au nombre de caractères à renvoyer)

toto= Mid("Vendredi", 5, 2) ' renvoie toto="re"

Si vous souhaitez récupérer toute la chaîne à partir du 5eme caractère, n'indiquez pas le dernier argument

toto=Mid("Vendredi", 5) 'Renvoie toto="redi"

fred

Bien...

De toute façon, VBA est très riche et les solutions pour parvenir à ses fins restent suffisamment nombreuses.

En fait, j'avais un peu extrapolé cette solution en m'inspirant de la page 'Manipuler les chaines" du site de dvp.

Voici en substance ce que j'y avais trouvé:

Sub ModifChaine()
    Dim St As String

    St = "deceloppez.com"
    Debug.Print St

    'Oups... une erreur de frappe sur 3° caractère...
    'Utilisons Mid pour le modifier
    Mid(St, 3, 1) = "v"
    Debug.Print St
End Sub

Et je me suis dit qu'en remplaçant "v" par "", ça pouvait fonctionner.

Tant pis.

Merci encore et à bientôt pour d'autres questions car j'écris une macro un petit peu grande et je lutte en permanence pour arriver à mes fins (surtout faire des userforms dynamiques qui utilisent donc des variables dans une sub).

re bonjour

en effet apres vérification cela est possible.....

voici une proposition qui enlève les voyelles en partant de la fin jusqu'a avoir un mot contenant 8 caractères

Sub test()

Dim chaine, chaine_testAs String
Dim j As Integer

chaine = Range("A1")
If Len(chaine) > 8 Then
chaine_test = chaine
For j = Len(chaine) To 1 Step -1
Select Case LCase(Mid(chaine_test, j, 1))  'lettre en minuscule pour tester qu'une seule possibilité
Case "a", "e", "i", "o", "u", "y"
chaine_test = Mid(chaine_test, 1, j - 1) & Mid(chaine_test, j + 1, Len(chaine_test))
End Select
If Len(chaine_test) <= 8 Then Exit For
Next
End If
chaine = chaine_test
'et ensuite ton instruction 
'ActiveSheet.Cells(iRows, i).Value = chaine
End Sub

fred

merci de mettre le sujet valider si c'est le cas

96classeur1.xlsm (14.36 Ko)

Bonjour Fred.

Ce que vous m'avez envoyé fonctionne parfaitement bien.

Je suis arrivé au même résultat mais par d'autres moyens (pas tellement éloignés vrai dire) et ce qui est intéressant, c'est que ça me permet de voir d'autres fonctions comme le select case que je n’utilise pas du tout.

En fait, je n'utilise que If et For Next et pour l'instant et rien d'autres.

Merci beaucoup pour ce temps passé à m'aider.

Je vais donc pouvoir valider le sujet.

Bonne semaine.

Cordialement.

Rechercher des sujets similaires à "supprimer caracteres chaine"