Changer caractère dans une chaine

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 !!!

4 réponses

  1. 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
    1. 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
    2. Re,

      je vous fais ca de suite
      0
    3. 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
    4. 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
  2. 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
    1. 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
      1. 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