Séparer chaine de caractere par des espaces

Résolu/Fermé
greg_in_motion - 24 mai 2011 à 10:31
michel_m Messages postés 16579 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 1 octobre 2022 - 7 juin 2011 à 10:44
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

michel_m Messages postés 16579 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 1 octobre 2022 3 281
Modifié par michel_m le 1/06/2011 à 16:28
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
michel_m Messages postés 16579 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 1 octobre 2022 3 281
24 mai 2011 à 10:43
Bonjour,

est ce toujours du m^me type:
5 chiffres -espace -lettre"S" plus 3 chiffres -espace- 5 chiffres ?
0
greg_in_motion
24 mai 2011 à 10:44
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
michel_m Messages postés 16579 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 1 octobre 2022 3 281
24 mai 2011 à 10:49
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
greg_in_motion
24 mai 2011 à 10:52
Oui toujours :)
0
michel_m Messages postés 16579 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 1 octobre 2022 3 281
24 mai 2011 à 10:56
OK c'est parti, 6000 lignes on passera peut-^tret par du VBA
sois patient !
0
greg_in_motion
24 mai 2011 à 10:59
Merci beaucoup de ton aide :)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
michel_m Messages postés 16579 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 1 octobre 2022 3 281
24 mai 2011 à 14:21
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
greg_in_motion
24 mai 2011 à 14:31
Ca me fait, "erreur de compilation"... Désolé, je ne suis pas très doué sur VBA...

Merci en tout cas.
0
michel_m Messages postés 16579 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 1 octobre 2022 3 281
24 mai 2011 à 16:53
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
greg_in_motion
25 mai 2011 à 15:05
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
michel_m Messages postés 16579 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 1 octobre 2022 3 281
25 mai 2011 à 15:26
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
greg_in_motion
25 mai 2011 à 15:29
En fait moi j'obtiens :

12345 Z12 S12 3456

Il faudrait 3 chiffres après le S
0
michel_m Messages postés 16579 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 1 octobre 2022 3 281
25 mai 2011 à 15:38
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
greg_in_motion
25 mai 2011 à 15:53
Okey... J'ai compris le problème...

Les références ne se termine pas toujours par 5 chiffres... c'est aléatoire.
0
michel_m Messages postés 16579 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 1 octobre 2022 3 281
Modifié par michel_m le 25/05/2011 à 18:03
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
Le Pingou Messages postés 11244 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 5 octobre 2022 1 312
25 mai 2011 à 22:38
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
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
Le Pingou Messages postés 11244 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 5 octobre 2022 1 312
26 mai 2011 à 14:21
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
michel_m Messages postés 16579 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 1 octobre 2022 3 281
Modifié par michel_m le 26/05/2011 à 12:54
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
michel_m Messages postés 16579 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 1 octobre 2022 3 281
Modifié par michel_m le 26/05/2011 à 12:55
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
greg_in_motion
27 mai 2011 à 11:09
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
michel_m Messages postés 16579 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 1 octobre 2022 3 281
27 mai 2011 à 11:51
bonjour,

oui mais pas a vant lundi!....

si il n'y a pas de 2°bloc Zxx que fait on ?
0
greg_in_motion
27 mai 2011 à 12:01
Pas de soucis.

On laisse la cellule de la deuxième colonne vide.
0
greg_in_motion
6 juin 2011 à 15:55
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
michel_m Messages postés 16579 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 1 octobre 2022 3 281
6 juin 2011 à 16:30
bonjour

bin Vaucluse, très bon formuliste est en train d'essayer de t'aider ?
0
Vaucluse Messages postés 26495 Date d'inscription lundi 23 juillet 2007 Statut Contributeur Dernière intervention 8 avril 2022 6 276
Modifié par Vaucluse le 6/06/2011 à 18:00
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
michel_m Messages postés 16579 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 1 octobre 2022 3 281
6 juin 2011 à 18:17
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
Vaucluse Messages postés 26495 Date d'inscription lundi 23 juillet 2007 Statut Contributeur Dernière intervention 8 avril 2022 6 276
6 juin 2011 à 18:24
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
michel_m Messages postés 16579 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 1 octobre 2022 3 281
Modifié par michel_m le 6/06/2011 à 18:31
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
Le Pingou Messages postés 11244 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 5 octobre 2022 1 312
6 juin 2011 à 16:14
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