Manipulation de caractères

Bonjour à tous est par avance merci pour l'aide que vous allez m'apporter.

Dans la fonction "Replace" je veux supprimer une chaine de caractères exemple:

Replace(Cells(i,j).Value = Replace(Cells(i,j).value, "dotexteben", "")

Problème dans "dotexteben", texte correspond à une chaine de caractère variable. J'ai essayé de mettre "*" ("do*ben") et même (do%ben), à la place de "texte", qui devrait remplacer plusieurs caractères mais cela ne fonctionne pas.

Y-a-t-il une solution? et si oui laquelle?

Avec mes remerciements

paterbleutch

bonsoir paterbleutch,

avez-vous un fichier avec quelques exemples pour voir ce que vous voulez ? Donc source et résultat

Bonsoir,

un essai de syntaxe :
Cells(i,j).Value = Replace(Cells(i,j).value, "do" & VariableText & "ben", "")

VariableText est une variable avec le texte voulu. Après regardez un peu la syntaxe finale de l'instruction par rapport à la votre.
La valeur de la cellule "i,j" est égale à sa valeur dont on remplace do & le texte variable et ben, par un double guillemet donc rien.

@ bientôt

LouReeD

Bonsoir Paterbleutch, le Fil,

Si c'est pour remplacer dans une boucle x, y

Alors utilise une condition:

If left(Cells(x,y),2) = "do" and right(cells(x,y), 3) = "ben" and len(cells(x, y) >5 then Cells(x,y)=""

bonjour le fil,

une autre méthode

Sub test()
     s1 = "do": s2 = "ben"
     For Each c In Range("A1:D20").Cells
          s = c.Value2
          i1 = InStr(1, s, s1, 1)            'trouver chaîne "DO" ou "do" ou "Do" ou "dO"
          If i1 > 0 Then                     'trouvé !!!
               'méthode 1
               i2 = InStr(i1 + 1, s, s2, 1)     'trouver le premier "ben" (+variantes) après le"DO"
               'méthode 2
               i3 = InStrRev(s, s2, , 1)     'trouver le dernier "ben" (même avant ce "do")
               'dépendant de la méthode, on prend i2 ou i3
               If i3 > i1 Then c.Value = Left(s, i1 - 1) & Mid(s, i3 + Len(s2))
          End If
     Next
End Sub

Bonjour à tous,

BsAlv, X Cellus, LouReeD, merci pour vos réponses, mes capacités en excel vba, s'améliorent mais elles sont largement insuffisantes pour comprendre instantanément les codes que vous me proposer. J'analyse et je reviens

Bonjour

Problème dans "dotexteben", texte correspond à une chaine de caractère variable. J'ai essayé de mettre "*" ("do*ben") et même (do%ben), à la place de "texte", qui devrait remplacer plusieurs caractères mais cela ne fonctionne pas.

ok sauf que la on a un e erreur Conceptuelle dans le raisonnement (sauf paramètre plus précis sur le joker)

imaginons que la chaine soit " se soir toto ira dormir chez son ami ben la malice "

ça donnerait

" se soir toto ira la malice "

la tout d'un coup c'est moins bien l'idée du replace

patrickT, il est vrai que si l'on regarde "plus large" le replace n'est pas forcément la bonne solution si ce n'est que la demande est là et en effet un peu juste pour une réponse adéquate !
Maintenant le demandeur à réagit reste plus qu'à attendre son prochain retour.

@ bientôt

LouReeD

bonsoir loureed

oui c'est ce que je disais le paramètre do et ben n'est celui qui prévaut dans cet exercice

c'est ce qu'il y a entre les deux

parti de là avec les versions récentes de excel il y a regex.extract me semble t il

et donc un pattern de groupe

groupe 1\s+ (do)

groupe 2(\D+|\d+)'créer une limite ici

groupe3 (ben)+\s

si le pattern renvoie ces 3 groupes c'est le bon

Hello,

Je n'ai peut-être rien compris à la demande car il n'y a pas d'exemple réel de chaînes à traiter, mais il me semble qu'avec les expressions régulières, avec le motif .* (qui signifie 0 ou plus de n'importe quel caractère) , avec la fonction replace on puisse obtenir ce qui est demandé. Exemple de code :

Sub EnleverChaines()
 Dim x As Long, y As Long
 Dim re As Object
 Set re = CreateObject("VBScript.RegExp")
 re.pattern = "do.*ben": re.Global = True
 For x = 1 To 10
     For y = 1 To 2
     Cells(x + 12, y).Value = re.Replace(Cells(x, y), "")
     Next y
 Next x
End Sub

voici ce que cela donne :

enleverchaines

Ami calmant, J.P

Bonjour le Très vieux cochon

essaie voir avec

"lola est sorti avec sa copine lili , Dominique et ben son meilleur ami , sa mère pourra lire tranquillement le courrier de DotbilBen sans être dérangée"

ou encore si on ne considère pas les fautes d'accents

c'est un double événement benéfique pour toute la famille ils partent en vacances a douzenbenaoui pour une semaine avec une somme rondelette de 5000€ gagné a la compétition de .....

Hello PatrickT,

tant que Paterbleutch ne nous donne pas des exemples des contenus de ses cellules et de ce qu'il veut obtenir, tout code est une investigation et ne correspond peut-être pas à la demande et possède des failles. Tes phrases sont des cas particuliers et cela m'étonnerait que Paterbleutch ait ce genre de phrase dans ses cellules.

re

je continue a dire que si le pattern de ce qui est entre "do" et "ben" n'a pas uns structure identifiable

c'est pas une faille mais une erreur conceptuelle

soit des caractères particuliers

soit pas d'espace(ça ça fait déjà sauter lesexpressions en plusieurs mots, donc plus simple)

si espace les espaces devront figuer dans le patternet la chaine avoir une structure avec les espaces

je joue suffisamment avec ça pour savoir ou ça nous amène, même si je n'ai pas de solution a proposer (si tant est qu'il en ai une)

mais en effet le demandeur doit préciser sa demande dans ce sens

Wait and See

BsAlv, LouReeD, X Cellus, patrickT, Jurassic Pork merci de vous intéresser à mon problème de caractère.

Je me suis mal fait comprendrealors voilà des précisions;

Dans une colonne de mon tableau les cellules sont du texte, que l'on peut écrire comme cela : "texte1 do texte2 ben texte3" (do et ben sont toujours présents)

où texte1, texte2, texte3, sont aléatoires et toujours différent. Mon but est transformer dans la cellule :

"texte1 do texte2 ben texte3" en "texte1 texte3".

c'est pourquoi j'imaginais d'utiliser replace pour supprimer "do texte2 ben"; et cela me plaisait pour la simplicité semble-t-il et très rapide

BsAlv, votre code fonctionne

LouReeD, votre proposition Cells(i,j).Value = Replace(Cells(i,j).value, "do" & VariableText & "ben", "") me plait car elle simplifie mon code, sauf que je ne sais pas comment replacer le texte par *. Si je remplace "VariableText" par * cela ne plait pas à VBA

X Cellus, votre code ne correspond pas à ce que je cherche à faire, c'est de ma faute pour m'être mal fait comprendre

patrickT, vous avez peut être vu juste

Jurassic Pork, vous avez compris votre tableau en témoigne. Mais.... c'est trop puissant pour moi, je ne comprends pas le code mes connaissances en vBA sont trop basiques.

Petite précision do et ben ou /do et /ben sont uniques dans toutes les cellules

re

et bien le replace c'est bien mais le instr doit être double mid,instr,instrrev,etc.. n'accepte pas le joker

donc allons y pour le replace

fonction tenant compte des espaces

'si les espaces sont a prendre en compte
Function NoDoBen(v As String)
    Dim x1%, x2%
    x1 = InStr(1, v, " do")
    x2 = InStr(x1, v, "ben ")
     If x1 + x2 <> x1 Then NoDoBen = Replace(v, Mid(v, x1, x2 + 4 - x1), " ")
End Function

fonction ne tenant pas compte des espaces

'si les espaces ne sont pas a prendre encompte
Function NoDoBen2(v As String)
    Dim x1%, x2%
    x1 = InStr(1, v, "do")
    x2 = InStr(x1, v, "ben")
     If x1 + x2 <> x1 Then NoDoBen2 = Application.Trim(Replace(v, Mid(v, x1, x2 + 3 - x1), " "))
End Function

on teste avec une sub

Sub test()
    MsgBox "NoDoBen : " & NoDoBen("bla blabla do%fgben jfg turi") & vbCrLf & _
                "NoDoBen2 : " & NoDoBen2("bla blabla do%fgben jfg turi")
End Sub

resultat

image

tu voulais un replace ben voila

on observe que quand on prend pas en compte les espaces il nous reste un espaces en trop

et si on prend en compte les espaces et qu'il y en a pas ben walouh c'est perdu

donc au mieux dans le pire

on garde celle sans espaces mais on fait un trim globale Application

Function NoDoBen2(v As String)
    Dim x1%, x2%
    x1 = InStr(1, v, "do")
    x2 = InStr(x1, v, "ben")
     If x1 + x2 <> x1 Then NoDoBen2 = Application.Trim(Replace(v, Mid(v, x1, x2 + 3 - x1), " "))
End Function

cela dit si plusieurs espaces consécutifs dans la chaine sont volontairement placé et bien c'est perdu

cela dit maintenant tu a le choix au mieux dans le pire

patricktoulon

Bonsoir Paterbleutch, le Fil,

Effectivement avec cette précision apportée à la structure textuelle composée de plusieurs termes.

Vu que tu utilises Excel 2019 la formule Fractionner.Texte peut t'aider sans besoin de VBA.

Faire ainsi: de la cellule B1 (ou autre) et copier la formule ci-dessous vers le bas. Pour données débutant en A1. À modifier selon besoin.

FRACTIONNER.TEXTE(FRACTIONNER.TEXTE(A1;"ben");A1;"do")

Bonjour

plutôt que de chercher à remplacer le milieu, concaténer ce qu'il y a à gauche de "do" et à droite de "ben".

en gérant les espaces et l'absence de "do" et "ben", ça donne

=SIERREUR(SUPPRESPACE(GAUCHE(A1;TROUVE("do";A1)-1) & DROITE(A1;NBCAR(A1)-TROUVE("ben";A1)-2)); A1)

Avec les fonctions TEXTE.AVANT et TEXTE.APRES si disponibles

=SIERREUR(SUPPRESPACE(TEXTE.AVANT(A1;"do")&TEXTE.APRES(A1;"ben"));A1)

A adapter en VBA au besoin

Stéphane

Rechercher des sujets similaires à "manipulation caracteres"