Changer caractère dans une chaine

moseca Messages postés 32 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 !!!



A voir également:

4 réponses

f894009 Messages postés 17277 Date d'inscription   Statut Membre Dernière intervention   1 713
 
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
0
moseca Messages postés 32 Date d'inscription   Statut Membre Dernière intervention  
 
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).
0
f894009 Messages postés 17277 Date d'inscription   Statut Membre Dernière intervention   1 713
 
Re,

je vous fais ca de suite
0
f894009 Messages postés 17277 Date d'inscription   Statut Membre Dernière intervention   1 713
 
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
0
moseca Messages postés 32 Date d'inscription   Statut Membre Dernière intervention  
 
Bonjour,
je l'ai essayé mais ça plante. Voici la ligne qui plante :

texte2 = "-" & texte2 & Mid(texte, pos0 + of7, Lg - pos0 + (1 - of7))

MERCI!
0
f894009 Messages postés 17277 Date d'inscription   Statut Membre Dernière intervention   1 713
 
0
moseca Messages postés 32 Date d'inscription   Statut Membre Dernière intervention  
 
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!
0
moseca Messages postés 32 Date d'inscription   Statut Membre Dernière intervention  
 
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!
0
Normad Messages postés 112 Date d'inscription   Statut Membre Dernière intervention   40
 
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
0