Changer caractère dans une chaine
moseca
Messages postés
37
Statut
Membre
-
Normad Messages postés 112 Date d'inscription Statut Membre Dernière intervention -
Normad Messages postés 112 Date d'inscription Statut Membre Dernière intervention -
Bonjour les experts. J'aimerais avoir de l'aide. SVP, SVP.
J'ai une chaine de caractère comme ceci : 1ABC2BCD5CDE12EFG15CDF. Alors, il y a toujours 3 lettres précédées de 1 à 2 chiffres (les chiffres varient de 1 à 15).
J'aimerais une macro VBA (ou formule Excel) qui ajoute un signe moins devant les chiffre. On aura donc: -1ABC-2BCD-5CDE-12EFG-15CDF
MERCI DE VOTRE PRÉCIEUX AIDE !!!
J'ai une chaine de caractère comme ceci : 1ABC2BCD5CDE12EFG15CDF. Alors, il y a toujours 3 lettres précédées de 1 à 2 chiffres (les chiffres varient de 1 à 15).
J'aimerais une macro VBA (ou formule Excel) qui ajoute un signe moins devant les chiffre. On aura donc: -1ABC-2BCD-5CDE-12EFG-15CDF
MERCI DE VOTRE PRÉCIEUX AIDE !!!
4 réponses
-
Bonjour,
VBA: pas de controle si la chaine contient autre chose que des lettres et chiffres, la chaine doit etre du format indique (minuscules admises)
Il y a peut-etre plus simple, a voir
Sub test()
Dim Flag_paq1 As Boolean
texte = UCase(Worksheets("feuil1").Range("C3"))
Lg = Len(texte)
Lg1 = Lg - 1
pos0 = 1
For p = 1 To Lg1
AsLC = Asc(Mid(texte, p, 1))
AsLS = Asc(Mid(texte, p + 1, 1))
'test si lettre suivie d'un chiffre
If AsLC > 64 And AsLS < 59 Then
If Not Flag_paq1 Then
paq1 = p
Flag_paq1 = True
End If
If p = paq1 Then
of7 = 0
Else
of7 = 1
End If
texte2 = texte2 & Mid(texte, pos0 + of7, p - pos0 + (1 - of7)) & "-"
pos0 = p
End If
Next p
texte2 = "-" & texte2 & Mid(texte, pos0 + of7, Lg - pos0 + (1 - of7))
Worksheets("feuil1").Range("C5") = texte2
End Sub-
JE viens de tester et ca FONCTIONNE TRES BIEN!! C'est GÉNIAL!!
Mais y a t il moyen d'y ajouter une boucle for car je dois faire changer plusieurs lignes, par exemple, faire cette opération pour les Range("A1:A15") et les mettre dans une autre plage, par exemple Range ("B1:B15"). J'ai essayer mais ça a planté.
MERCI ENCORE CHAMPION(ne). -
-
Re,
pour cellules A1 a A15 vers B1 a B15
Sub test()
Dim Flag_paq1 As Boolean
For Point = 1 To 15
texte2 = ""
texte = UCase(Worksheets("feuil1").Cells(Point, 1))
Lg = Len(texte)
Lg1 = Lg - 1
pos0 = 1
For p = 1 To Lg1
AsLC = Asc(Mid(texte, p, 1))
AsLS = Asc(Mid(texte, p + 1, 1))
'test si lettre suivie d'un chiffre
If AsLC > 64 And AsLS < 59 Then
If Not Flag_paq1 Then
paq1 = p
Flag_paq1 = True
End If
If p = paq1 Then
of7 = 0
Else
of7 = 1
End If
texte2 = texte2 & Mid(texte, pos0 + of7, p - pos0 + (1 - of7)) & "-"
pos0 = p
End If
Next p
texte2 = "-" & texte2 & Mid(texte, pos0 + of7, Lg - pos0 + (1 - of7))
Worksheets("feuil1").Cells(Point, 2) = texte2
Next Point
End Sub -
-
-
-
Bonjour, Merci! Je vais essayer ça.
Mais la chaine contient que des lettres et chiffre, comme je l'ai indiqué dans mon exemple.
MERCI ENCORE! -
Bonjour
En fiat, je viens de remarquer un petit problème. Si on a 6 caractère ça fonctionne pas correctement.
Par exemple : 1ABC2XYC ça donne -1ABC-C2XYZ
MERCI DE M'AIDER! -
Bonjour,
En testant les caractères l'un après l'autre avec la fonction IsNumeric. Si un carctère numérique est trouvé prend aussi en compte le(s) suivant(s) s'ils sont aussi numéique avant d'ajouter un "-" devant.
Sub Modifie() Dim strBase As String, NewStr As String, I As Integer, Y As Integer, Car As String strBase = Worksheets("feuil1").Range("C3").Value For I = 1 To Len(strBase) Car = Mid(strBase, I, 1) If IsNumeric(Car) Then For Y = I + 1 To Len(strBase) If IsNumeric(Mid(strBase, Y, 1)) Then Car = Car & Mid(strBase, Y, 1) I = I + 1 Else Exit For End If Next Y NewStr = NewStr & "-" & Car Else NewStr = NewStr & Car End If Next I Worksheets("feuil1").Range("C5").Value = NewStr End Sub