Séparer chaine de caractere par des espaces

Résolu
greg_in_motion -  
michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

Je rencontre un problème dans mon boulot. En effet, je travail sur liste de référence à plusieurs caractères dans une même colonnes. Il y a environ 6000 lignes.

J'aimerai séparer par des espaces les références, par exemple : 62301S57212000 =>
62301 S572 12000

Avez vous une idée ?

Merci beaucoup d'avance.

13 réponses

  1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Bonjour

    Je t'apportais une solution, mais un modérateur- balladur13- a jugé que mon coup de gueule était "hors de propos"...

    Dans ces conditions, j'abandonne définitivement le suivi, vois avec ce modérateur qui devrait résoudre facilement le problème puisque le flou - que tu as reconnu être- ne semblait pas lui poser un problème pour résoudre le tien... Ce sera d'ailleurs la première fois que je le verrai solutionner un problème Excel.

    Sincèrement désolé
    Michel
    1
  2. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Bonjour,

    est ce toujours du m^me type:
    5 chiffres -espace -lettre"S" plus 3 chiffres -espace- 5 chiffres ?
    0
  3. greg_in_motion
     
    Non, il y a des fois des références avec :

    62301 Z01 S572 12000

    Ca doit compliquer un peu le truc je suppose... :(
    0
    1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      oui ca complique hachement mais
      les séparations internes (ZO1 S572) commencent elles toujours par une lettre et la dernière (12000 par un chiffre) ?

      Comme c'est complexe, sois précis, merci d'avance :-)
      0
    2. greg_in_motion
       
      Oui toujours :)
      0
    3. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      OK c'est parti, 6000 lignes on passera peut-^tret par du VBA
      sois patient !
      0
  4. greg_in_motion
     
    Merci beaucoup de ton aide :)
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    re,

    valable si dernier bloc = 5 chiffres... si autre possibilité je rectifierai

    Const col As String * 1 = "A" 'colonne des references
    Const lig As Byte = 1 'ligne de départ des reférences
    
    
    Sub modifier_ref()
    Dim valeur As String
    derlig = Cells(Cells.Rows.Count, 1).End(xlUp).Row
    Application.ScreenUpdating
    For cptr = 1 To derlig
      Cells(cptr, col) = espacer(Cells(cptr, col))
    Next
    End Sub
    
    
    Function espacer(texto As String) As String
    Dim reg As Object
    Dim extraction As Object
         'recherche les lettres dans la cellule
        Set reg = CreateObject("vbscript.regexp")
        reg.Global = True
        reg.Pattern = "(\D)"
        Set extraction = reg.Execute(texto)
        For Each digit In extraction
            lettres = lettres & (digit.Value)
        Next digit
    'met les espaces
    Start = 1
    For cptr = 1 To Len(lettres)
         lettre = Mid(lettres, cptr, 1)
         pos = Application.Search(lettre, texto)
         espacer = espacer & " " & Mid(texto, Start, pos - Start)
         Start = pos
    Next
    espacer = LTrim(espacer & " " & Mid(texto, pos, Len(texto) - 5 - pos) & " " & Right(texto, 5))
    End Function
    
    0
  7. greg_in_motion
     
    Ca me fait, "erreur de compilation"... Désolé, je ne suis pas très doué sur VBA...

    Merci en tout cas.
    0
    1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      Re,

      comme j'étais pressé.... :-(

      macro corrigée, excuses moi (la fonction est OK)

      Sub modifier_ref()
      derlig = Cells(Cells.Rows.Count, 1).End(xlUp).Row
      Application.ScreenUpdating = False
      For cptr = lig To derlig
        Cells(cptr, col) = espacer(Cells(cptr, col))
      Next
      End Sub


      ci joint maquette
      https://www.cjoint.com/?AEyq0UFxwvA
      0
  8. greg_in_motion
     
    Merci beaucoup pour la maquette.

    Cependant, ca pose problème...

    Dans ma liste, j'ai des références :

    12345Z12S12345678
    12345S12345678

    Il me faudrait des espaces comme ça :

    12345 Z12 S123 45678
    12345 S123 45678

    C'est faisable ?

    Merci d'avance et désolé d'être pénible... :(
    0
    1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      bonjour,

      ce n'est pas ce que j'ai fait ? le nombre de "blocs-lettre" est indifférent....

      je viens d'essayer en enlevant des blocs-lettre par ci par là et c'est OK

      a moins que je n'ai pas vu un piège ???
      0
    2. greg_in_motion
       
      En fait moi j'obtiens :

      12345 Z12 S12 3456

      Il faudrait 3 chiffres après le S
      0
    3. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      j'vas finir par devenir chèvre avec les histoires de +1 ou -1...

      Function espacer(texto As String) As String
      Dim reg As Object
      Dim extraction As Object
          Set reg = CreateObject("vbscript.regexp")
          reg.Global = True
          reg.Pattern = "(\D)"
          Set extraction = reg.Execute(texto)
          For Each digit In extraction
              lettres = lettres & (digit.Value)
          Next digit
      Start = 1
      For cptr = 1 To Len(lettres)
           lettre = Mid(lettres, cptr, 1)
           pos = Application.Search(lettre, texto)
           espacer = espacer & " " & Mid(texto, Start, pos - Start)
           Start = pos
      Next
      espacer = espacer & " " & Mid(texto, pos, Len(texto) - 4 - pos) & " " & Right(texto, 5)
      End Function
      0
    4. greg_in_motion
       
      Okey... J'ai compris le problème...

      Les références ne se termine pas toujours par 5 chiffres... c'est aléatoire.
      0
    5. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      Oui, mais là je ne peux rien pour toi
      et pourtant lien N° 5, je précisais
      valable si dernier bloc = 5 chiffres

      Il faut bien te rendre compte que ce que tu demandes n'est pas forcément facile et que personne ne veut passer parfois plusieurs heures à essayer de résoudre un problème bénévolement pour se voir dire après coup « non vous n'avez pas compris mon problème (rarement, je n'ai pas bien expliqué) il faut en plus que, etc.... »

      bref j'ai perdu mon temps avec Toi :-(((
      Ciao
      0
  9. Le Pingou Messages postés 12275 Date d'inscription   Statut Contributeur Dernière intervention   1 477
     
    Bonjour,
    Juste au passage, principe :
    .-premier bloc jusqu'à la première lettre (non comprise)
    .-deuxième bloc la première lettre plus les chiffres suivant jusqu'à la première lettre (non comprise)
    .- si une deuxième lettre on a un troisième bloc comme sous deuxième
    .- pour terminer le dernier bloc est formé des 5 derniers chiffres
    62301S57212000 -? 62301 S572 12000
    12345Z1245S12345678 ? 12345 Z1245 S123 45678
    12345S12345678 ? 1345 S123 45678
    Est-ce bien comme cela ?
    0
  10. greg_in_motion
     
    C'est presque ça :-)

    Pour le premier bloc, il est toujours constitué de 5 chiffres.

    Le deuxième bloc est facultatif et commence toujours par Z et est toujours suivi par 2 chiffres :

    12345 Z12

    Le troisième bloc commence toujours par S et est suivi toujours par 3 chiffres :

    12345 Z12 S123

    Le dernier bloc peut contenir entre 3 et 7 chiffres.

    12345 Z12 S123 123...
    0
    1. Le Pingou Messages postés 12275 Date d'inscription   Statut Contributeur Dernière intervention   1 477
       
      Bonjour greg_in_motion,
      Merci pour l'information.
      Je m'arrêterai là car la solution est entre vos mains par l'intermédiaire de michel
      _m.
      Salutations.
      Le Pingou
      0
  11. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Pourquoi ne pas l'avoir dit au début ? 5 chiffres,les lettres Z+2c hiffres et S+3chiffres, bloc Z aléatoire

    En info, avec tout langage m^me VBA, il faut être extrêmement précis et clair: dans ce cas, cela aurait évité de programmer et reprogrammer des usines à gaz (qui te couteraient cher si c'était fait à titre onéreux)

    Penses y la prochaine fois que tu fais appel à un forum

    sans rancune
    Michel
    0
    1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      le pb m'ayant branché et sans refaire la macro

      Const col As String * 1 = "A" 'colonne des ref  
      Const lig As Byte = 5 'ligne de départ des ref  
      
      
      Sub modifier_ref()  
      derlig = Cells(Cells.Rows.Count, 1).End(xlUp).Row  
      Application.ScreenUpdating = False  
      For cptr = lig To derlig  
        Cells(cptr, col) = espacer(Cells(cptr, col))  
      Next  
      End Sub  
      
      Function espacer(texto As String) As String  
      Dim reg As Object  
      Dim extraction As Object  
          Set reg = CreateObject("vbscript.regexp")  
          reg.Global = True  
          reg.Pattern = "(\D)"  
          Set extraction = reg.Execute(texto)  
          For Each digit In extraction  
              lettres = lettres & (digit.Value)  
          Next digit  
      Start = 1  
      For cptr = 1 To Len(lettres)  
           lettre = Mid(lettres, cptr, 1)  
           pos = Application.Search(lettre, texto)  
           debut = debut & " " & Mid(texto, Start, pos - Start)  
           nbre = nbre + 1 
           Start = pos 
      Next 
      debut = debut & " " & Mid(texto, pos, 4) 
      espacer = debut & " " & Right(texto, Len(texto) + nbre + 1 - Len(debut)) 
      
      0
    2. greg_in_motion
       
      Super ! Ca marche nikel !!! Merci beaucoup ! Et encore désolé pour mon manque de précision....

      Svp, j'aurai une dernière question :

      Maintenant que les références sont "claires", est-il possible d'utiliser l'inverse de la fonction concatener afin d'avoir le 1er bloc, dans une 1ère colonne, le deuxieme bloc (Z01) dans une deuxieme colonne, la 3ème bloc (S574) dans une troisième colonne etc... ??? Afin de pouvoir faire une liste déroulante pour chaque bloc ?
      0
    3. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      bonjour,

      oui mais pas a vant lundi!....

      si il n'y a pas de 2°bloc Zxx que fait on ?
      0
  12. greg_in_motion
     
    Pas de soucis.

    On laisse la cellule de la deuxième colonne vide.
    0
  13. greg_in_motion
     
    J'aurai une autre question svp.

    Je voudrai ajouter un espace dans le dernier bloc, après le cinquième caractère du dernier bloc, cela est-il possible ? Via une formule ?
    0
    1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      bonjour

      bin Vaucluse, très bon formuliste est en train d'essayer de t'aider ?
      0
    2. Vaucluse Messages postés 27336 Date d'inscription   Statut Contributeur Dernière intervention   6 453
       
      Salut michel

      peut être très bon,(merci mais c'est trop!) mais je renonce, là, il y a trop de cas pour faire quelque chose de raisonnable sur >7000 lignes!
      Je regrette qu'excel ne donne pas de formule pour compter le nombre de caractères spécifiques dans une texte (ici le nombre de blanc) car ensuite avec substitue, ce serait un jeu d'enfant.
      Ce n'est pas la première fois que je souhaiterais ce genre de formule

      . Si tu as quelque chose sur le sujet, ,je suis preneur.

      Pépé a bien tenté, mais est ce bien une bonne solution que de traiter sur 10 colonnes environ?
      Pour ma part, je ne crois pas.

      Bien cordialement
      ps: les cerises ne sont pas mures chez moi
      0
    3. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      les cerises ne sont pas mures chez moi

      Voilà les conséquences d'avoir quitté le Vaucluse pour aller au nord de Montélimar, c.à.d. quasiment en Scandinavie... :-)

      petite fonction personnalisée pour compter les espaces
      Function compter_les_blancs(texto As Range) As Byte
      If texto = "" Then Exit Function
      tempo = Split(texto)
      compter_les_blancs = UBound(tempo)
      End Function
      0
    4. Vaucluse Messages postés 27336 Date d'inscription   Statut Contributeur Dernière intervention   6 453
       
      Voila une excellente réponse Michel, mais pour ma part:

      _ j'ai au moins échappé aux derniers orages dans le Vaucluse

      _ et plus grave, j'ai bien noté ta fonction personnalisée mais j'ose à peine demander comment on s'en sert?

      Je le saurais, ça pourrait me servir assez souvent, mais là, je suis sec. ... et tant mieux si ça te fait rire :-)

      Crdlmnt
      0
    5. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      tu l'installes dans un module (ca tu sais faire)

      quand tu veux utiliser ce petit bijou :oD ( fait en vitesse donc...)

      dans formules-insérer une fonction-fonction personnalisée

      l'idéal serait de la transformer en macro complémentaire .XLA mais est ce que ca vaut le coup d'avoir cà dans les menus....ou de créer un classeur perso de macro, j'en doute
      0
  14. Le Pingou Messages postés 12275 Date d'inscription   Statut Contributeur Dernière intervention   1 477
     
    Bonjour,
    Vous mettez un exemple concret de ce que vous désirez et mettre le fichier sur https://www.cjoint.com/ et poster le lien.
    0