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   -
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. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
     
    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. moseca Messages postés 37 Statut Membre
       
      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. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
       
      Re,

      je vous fais ca de suite
      0
    3. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
       
      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. moseca Messages postés 37 Statut Membre
       
      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. moseca Messages postés 37 Statut Membre
     
    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
  3. moseca Messages postés 37 Statut Membre
     
    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
  4. 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