Changer caractère dans une chaine

Fermé
moseca Messages postés 32 Date d'inscription samedi 19 avril 2014 Statut Membre Dernière intervention 17 mai 2022 - 15 mai 2014 à 05:03
Normad Messages postés 112 Date d'inscription dimanche 6 juin 2010 Statut Membre Dernière intervention 10 juin 2015 - 19 mai 2014 à 16:06
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 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 1 701
Modifié par f894009 le 15/05/2014 à 16:49
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 samedi 19 avril 2014 Statut Membre Dernière intervention 17 mai 2022
15 mai 2014 à 17:43
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 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 1 701
15 mai 2014 à 19:24
Re,

je vous fais ca de suite
0
f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 1 701
15 mai 2014 à 19:29
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 samedi 19 avril 2014 Statut Membre Dernière intervention 17 mai 2022
15 mai 2014 à 20:08
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 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 1 701
15 mai 2014 à 20:16
0
moseca Messages postés 32 Date d'inscription samedi 19 avril 2014 Statut Membre Dernière intervention 17 mai 2022
15 mai 2014 à 17:20
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 samedi 19 avril 2014 Statut Membre Dernière intervention 17 mai 2022
15 mai 2014 à 22:57
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 dimanche 6 juin 2010 Statut Membre Dernière intervention 10 juin 2015 37
19 mai 2014 à 16:06
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