Joli
Mais cela ne fonctionne que pour "-A". Il faut dupliquer et modifier les lignes pour chaque terminaison envisagée.
Version imprimable
re
sinon encore plus simple
le trim est la au cas ou l'occurence a la fin n'y serait pasCode:
1
2 toto = "RFE-A748E954125-A" MsgBox Trim(Replace(toto & " ", "-A ", ""))
ou meme
edit:Code:MsgBox Replace(Replace(toto & "||", "-A||", ""), "||", "")
correction au cas ou il y aurait un espace a la fin
le replace qui englobe le premier est la au cas ou l'occurence a la fin n'y serait pasCode:MsgBox Replace(Replace(Trim(toto) & "||", "-A||", ""), "||", "")
bonjour Pierre Fauconnier
oui si il y a des espaces dans la chaine
le 2d exemple devrait fonctionner surtout ques caracteres temporaires sont rarement utilisés
On ne tire pas des conclusions de codage du fait que certains caractères sont rarement utilisés. Il suffira que ces caractères soient utilisés une fois pour tout foutre par terre.
Si la règle est de supprimer "-A", "-B", "-C" lorsqu'il est en fin de chaîne, on ne peut que se baser sur cette règle pour écrire le code et sur aucune autre que l'on déduirait d'une liste d'exemple ou d'une non-utilisation supposée de caractères dans une chaîne. Sauf bien entendu si la règle énonce clairement cette impossibilité d'utilisation de certains caractères.
C'est pourquoi je préfère le formalisme des regex qui permet de déterminer les terminaisons envisagées. (L'astuce de Unparia devant être répétée pour chaque finale envisagée (-A, -B, ...)
L'avantage des regex, c'est que s'il s'avérait que finalement, on doive supprimer toutes les fins avec - + une majuscule, on n'aurait qu'à modifier le pattern de la regex pour y arriver...
"(-[A-C])$" deviendrait simplement "(-[A-Z])$" par exemple, et ce serait la seule modification à apporter au code (on pourrait d'ailleurs variabiliser ce pattern).
re
oui moi aussi perso je prefere de loin le regex dans ton exemple c'est categorique il ne peut pas y avoir d'erreur argument +fin de chaine "$"
c'est juste pour faire mes petites experiences avec les outils d'exel
Bonjour,
Pour rester sur une ligne à partir de l'idée de Jacques :
On cumule les Replace...
En espérant qu'il n'y ait pas 37 caractères à éviter...
Ne fonctionne pas...
Et sans passer par un objet Regex, en utilisant une chaine inversée, on peut avoir
Code:
1
2
3
4
5
6
7 Sub TEst() Dim cell As Range For Each cell In Range("a1:a5") If StrReverse(cell.Value) Like "[A-C]-*" Then cell.Value = Left(cell.Value, Len(cell.Value) - 2) Next End Sub
Je m'étais arrêté au tout premier message et n'avais pas vu que la demande avait ensuite été modifiée pour inclure toute autre lettre également.
Voilà alors une autre manière
ou encore :Code:
1
2
3 toto = "RFE-A748954125-B" If Right(toto, 2) Like "-[A-Z]" Then toto = Left(toto, Len(toto) - 2) MsgBox toto
parmi d'autres (une floppée + 15) possiblesCode:
1
2
3 toto = "RFE-A748954125-B" If toto Like "*-[A-Z]" Then toto = Left(toto, Len(toto) - 2) MsgBox toto
Oui Jacques,
Ta seconde solution, je la donnais déjà au message 10, puis je ne sais pas pourquoi, je me suis dit qu'elle ne fonctionnait pas si on avait "-[A-C]" en milieu de chaine, alors qu'elle fonctionne très bien... ^^
bonjour,
une question importante (pour moi ;) )
est ce qu'il faut supprimer toutes les fin dont le deuxième caractère de droite est "-" ? --> -A,-B,-C,...,-Z
@+JP
De toute manière via Like "*-[A-Z]" …
Oui Pierre
Les solutions ne manquent vraiment pas.
En voilà une autre encore
Je dois maintenant partir, mais suis certain de ce que l'utilisation de StrConv permettrait une accélération, bien qu'avec 3 ou 4 lignes de code en plus. Serait avantageux si le nombre de chaînes à traiter est très important. ;)Code:
1
2
3
4
5
6
7
8 toto = "RFE-A748954125-V" Dim titi titi = Split(toto, "-") Select Case titi(UBound(titi)) Case "A" To "Z" ReDim Preserve titi(UBound(titi) - 1) End Select MsgBox Join(titi, "-")
Si la règle était celle-là, on pourrait effectivement faire simple avec If toto Like "*-?" Then...
Comme souvent, c'est une définition claire et reprenant de façon exhaustive les cas à traiter qui permet d'aller au plus court vers la bonne solution...
Salut,
Ne voulant pas rester sur un échec....
Les solutions ne manquent effectivement pas...
Je reprends l'idée de Jacques (unparia pour ceux qui ne fréquentent pas régulièrement le forum...) :
Résultat :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 Option Explicit Sub t() Debug.Print Verif_toto("RFE-A748954125", "A", "B", "C") Debug.Print Verif_toto("RFE-A748954125-A", "A", "B", "C") Debug.Print Verif_toto("RFE-A748954125-B", "A", "B", "C") Debug.Print Verif_toto("RFE-A748954125-C", "A", "B", "C") Debug.Print Verif_toto("RFE-A748954125-D", "A", "B", "C") Debug.Print Verif_toto("RFE-A748954125-", "A", "B", "C") End Sub Private Function Verif_toto(texto As String, a As String, b As String, c As String) As String Dim s As String s = texto If Right(s, 2) Like "-[" & a & "-" & c & "]" Then s = Left(s, Len(s) - 2) & Replace(Replace(Replace(s, "-" & a, "", Len(s) - 2), s, "-" & b, Len(s) - 2), "-" & c, "") End If Verif_toto = s End Function
Par contre, je voudrais bien une explication sur le :Citation:
RFE-A748954125
RFE-A748954125
RFE-A748954125
RFE-A748954125
RFE-A748954125-D
RFE-A748954125-
qui donne 5 alors que le Start du Replace se situe après le 5...Code:
1
2 toto = "RFE-A748954125-A" Replace(toto, "-A", "", Len(toto) - 2)
re
j'entrevois qu'une explication
C EST L INDEXATION
de la meme maniere que un element(i) dans un tableau et le ième+1 DU TABLEAU l'indexation commencant par zero pour le premier
je jure de rien mais en meme temps il y a une logique
car sinon start 1 vaudrais la premiere lettre de la chaine elle serait donc carrément zappée par la mecanique
Replace(toto, "-A", "", Len(toto) - 2)
Len(toto) - 2 veut dire que la chaîne utilisée pour le REPLACE commence à partir de l'antépénultième caractère. Le résultat de ce REPLACE contiendra donc soit UN soit TROIS caractères selon que "-A" est trouvé dedans ou pas. Il suffit de coller ce résultat à la chaîne initiale tronquée des trois derniers caractères pour composer la chaîne résultante finale.
merci Pierre Fauconnier
Pièce jointe 354101
j'aurais personnellement tendance à faire ce à quoi je suis systématiquement enclin, c'est-à-dire ouvrir mon aide interne VBA à la rubrique Replace, Fonction
L'explication demandée y est exposée ici :
Amitiés à tousCitation:
Remarques
La valeur renvoyée par la fonction Replace est une chaîne, une fois les substitutions effectuées, qui commence à la position spécifiée par l'argument start et se termine à la fin de la chaîne expression. Il ne s'agit pas d'une copie de la chaîne d'origine du début à la fin.
Je pense que beaucoup ne savent pas ceci
Citation:
Il ne s'agit pas d'une copie de la chaîne d'origine du début à la fin.