OVH Cloud OVH Cloud

Chaines de caractères avec des espaces

15 réponses
Avatar
Jacques RAGNI
Bonjour à tous
Mon fichier comporte des centaines de lignes qui reçoivent des codes de
chiffres. Ces codes sont constitués par des chaines de 4 chiffres séparées
par 1 espace. Par exemple: 0125 7458 6589 0012 5681 etc. Certains sont très
longs.
Mon problème c'est que certains d'entre eux sont pollués par des espaces
surnuméraires: au lieu d'un espace entre 2 séquences de 4 chiffres, il y en
a 2, 3, 4, ou plus.
Exemple: 0125 7458 6589 0012 5681
Impossible de déterminer une règle de survenue, certains ont une anomalie,
d'autres en ont plusieurs.
Ces chaines de caractères sont au format "texte" car leur création s'est
faite à partir de valeurs intégrant les zéros "devant" pour garder la
séquence de 4 chiffres.
Je sais repérer ces chaines anormales en vba (activecell.value="*# *") ce
qui me permet de les colorer, mais je n'ai pas d'idée pour essayer de les
corriger.
Avez-vous une solution pour m'aider SVP?
En vous remerciant mille fois par avance...

5 réponses

1 2
Avatar
Tatanka
Là ça me semble OK.
Un peu tard mais il fallait que j'y arrive ;-)

Pour des cellules formatées « texte » :
Sub Quatre_Espace_Quatre()
Dim c As Range
Dim texte$, der$
For Each c In Selection
texte = Replace(Replace(c.Value, Chr(160), ""), Chr(32), "")
For i = 1 To Len(texte) Step 4
der = der & Mid(texte, i, 4) & " "
Next i
c.Value = Trim(der)
der = ""
Next c
End Sub

Serge



"Tatanka" a écrit dans le message de news: %
Sub Quatre_Espace_Quatre()
Dim c As Range
For Each c In Selection
c.Value = Trim(Application.Substitute(c.Value, Chr(160), ""))
Next c
End Sub



Toutes mes excuses, cette macro ne tient pas la route.

Serge


Avatar
manbas
Bonjour Letroll

Je te remercie +++ pour ta proposition. Comme tu le suggères on va rester
pragmatique.
Niveau de programmation élevé = ya bon, ça tire vers le haut.
Je sais d'où viennent les inégalités: elles sont crées par une macro qui
regroupe ces chaines de caractères à partir de libellés qui leurs
correspondent, dans le but de fournir un fichier excel qui sera ensuite
intégré dans un logiciel fullweb.
Depuis mon dernier message j'ai pu tester que les espaces inégaux ne sont
pas lus donc ne posent pas de probleme au logiciel. Donc mon probleme est
résolu.
Encore merci et à bientôt

"LE TROLL" <le a écrit dans le message de news:

Bonjour mambas,

En réponse :

Ce n'est pas réellement un code qui fonctionne que je t'ai passé, mais
un principe de ce qu'il fallait faire.
Désolé, encore une fois je ne sais pas du tout ce que tu sais faire par
rapport à ce que tu demandes.

Je pourrais tout t'expliquer, mais ça va te servir sans doute une seule
fois, donc tu vas l'oublier, et le temps passé à l'expliquer va dépasser
le temps qu'il faut pour écrire le code en VB6, alors, comme ce n'est pas
un fichier secret, pour moi ça ne veut rien dire, ce que je te propose est
de m'envoyer ton fichier boiteux en copie par mail à mon adresse :
montmartre75018 arobase free point fr

Ton fichier texte ne contient que des séries de 4 chiffres séparées par
un nombre aléatoire de blancs, et ce que tu veux, c'est bien qu'il n'y ait
qu'une séparation d'un seul espace (ascii 32) entre tes séries de 4
chiffres, ceci sur chaque ligne du fichier texte, excepté je présume en
dernière position de chaque ligne où il ne doit pas y avoir de blanc en
fin (d'où le Trim(), est-ce bien ça ?

Je te fais ça dans l'après-midi et je te renvois un exe testé en vb6
qui, dans un répertoire, mis en présence d'un fichier O.txt, te pondra un
fichier D.txt, ainsi que le code, de la sorte tu pourras l'appeler de ton
code (Shell), si ça se reproduit, car il faudrait normalement que tu sache
quoi faire pour que ça ne se reproduise pas, il doit y avoir une erreur
quelque part.

A te lire, cordialement.
-
Logiciels, romans, contacts : http://irolog.free.fr
_______________________
.
.


"manbas" a écrit dans le message de
news:
Bonjour letroll
Merci pour ta réponse. Comme tu l'as dis "ça dépends de mes compétences"
et là tu surfes sur des vagues un peu hautes pour moi!
1) J'ai crée deux fichiers textes, un appellé O et l'autre appellé D
(tous deux des copies .txt)
2) J'ai mis ton code dans un module XL
3) 3 lignes sont "en rouge" et m'empêchent de tester (je ne comprends pas
tout le code)
select case Mid(Trim(ligne)), i, 1)
et
écrit fichier D = ligneBis
et
rename D en O (dois je comprendre que je fais manuellement? mais alors
pourquoi Kill O ensuite?)


"LE TROLL" <le a écrit dans le message de news:
ub5cz%
Bonjour,

Le solution est simple, tout dépend de tes connaissances :

Faire une copie de sauvegarde du fichier d'origine O (copyFichierO.txt)
Tu ouvres le fichier d'origine en lecture texte O
Tu ouvres un nouveau fichier de destinations texte en écriture D
dim i as long
dim j as long
dim ligne as string
dim ligneBis as long

Do while EOF(fichier) <> true
if EOF(fichier) = True then exit Do
ligneBis=""
j = 0
for i = 1 to len(ligne)
select case mid(Trim(ligne)), i, 1)
case <> " " : j = 0
case else : j = j + 1
end select
if j < 2 then : ligneBis = ligneBis & mid(ligne, i, 1)
next i
écrit fichoer D = ligneBis
loop
rename D en O
Kill O

Il y a d'autre méthodes, comme changer tout ce qui est plus long que
" " en " " par ligne, etc...
Toutefois il faudrait aussi penser à voir ce qui cause ce problème et le
supprimer :o)
In fine, si ce sont des séries de 4 chiffres, il n'y a aucune utilité à
conserver le séparateur, ben oui, sauf pour le plaisir des yeux...

Cordialement ;o)
-
Logiciels, romans, contacts : http://irolog.free.fr
_______________________
.
.


"Jacques RAGNI" a écrit dans le message de
news:
Bonjour à tous
Mon fichier comporte des centaines de lignes qui reçoivent des codes de
chiffres. Ces codes sont constitués par des chaines de 4 chiffres
séparées par 1 espace. Par exemple: 0125 7458 6589 0012 5681 etc.
Certains sont très longs.
Mon problème c'est que certains d'entre eux sont pollués par des
espaces surnuméraires: au lieu d'un espace entre 2 séquences de 4
chiffres, il y en a 2, 3, 4, ou plus.
Exemple: 0125 7458 6589 0012 5681
Impossible de déterminer une règle de survenue, certains ont une
anomalie, d'autres en ont plusieurs.
Ces chaines de caractères sont au format "texte" car leur création
s'est faite à partir de valeurs intégrant les zéros "devant" pour
garder la séquence de 4 chiffres.
Je sais repérer ces chaines anormales en vba (activecell.value="*# *")
ce qui me permet de les colorer, mais je n'ai pas d'idée pour essayer
de les corriger.
Avez-vous une solution pour m'aider SVP?
En vous remerciant mille fois par avance...











Avatar
manbas
Bonjour Jex
"Magique" ta solution!
Merci beaucoup. Mon probleme s'est résolu par ailleurs dans l'interface avec
un autre logiciel (les espaces multiples ne posent plus de problème) mais
cette solution simplissime et efficace sera utilisée pour le fun.
Encore merci et à bientôt.


"Jex" a écrit dans le message de news:

Bonjour Jacques,

le code suivant permet de remplacer 2 espaces par un seul jusqu'à ce
que tous les espaces soient en un seul exemplaire.

ActiveSheet.Range("B:B") doit être adapté aux cellules voulues, par
exemple par ActiveSheet.Cells pour toute la feuille.
ScreenUpdating = False permet de ne pas réafficher la feuille et
accélère donc le traitement si le nombre de données à traiter est
important.

Dans un module, tu peux placer ceci :

-------------------------------------
Public Sub UnEspace()
Dim blnRep As Boolean
Dim rng As Range
Dim rngF As Range

Application.ScreenUpdating = False
Set rng = ActiveSheet.Range("B:B")

Do
blnRep = rng.Replace(" ", " ")
Set rngF = rng.Find(" ")
If rngF Is Nothing Then
Exit Do
End If
Loop

Application.ScreenUpdating = True
End Sub
-------------------------------------

En espérant que cela correspond à ton attente,
Jex (un autre Jacques...)

On 6 avr, 20:50, "Jacques RAGNI" wrote:
Bonjour à tous
Mon fichier comporte des centaines de lignes qui reçoivent des codes de
chiffres. Ces codes sont constitués par des chaines de 4 chiffres séparées
par 1 espace. Par exemple: 0125 7458 6589 0012 5681 etc. Certains sont
très
longs.
Mon problème c'est que certains d'entre eux sont pollués par des espaces
surnuméraires: au lieu d'un espace entre 2 séquences de 4 chiffres, il y
en
a 2, 3, 4, ou plus.
Exemple: 0125 7458 6589 0012 5681
Impossible de déterminer une règle de survenue, certains ont une anomalie,
d'autres en ont plusieurs.
Ces chaines de caractères sont au format "texte" car leur création s'est
faite à partir de valeurs intégrant les zéros "devant" pour garder la
séquence de 4 chiffres.
Je sais repérer ces chaines anormales en vba (activecell.value="*# *") ce
qui me permet de les colorer, mais je n'ai pas d'idée pour essayer de les
corriger.
Avez-vous une solution pour m'aider SVP?
En vous remerciant mille fois par avance...
Avatar
manbas
Bonjour Tatanka
Merci pour ta réponse.
ça le fait aussi, c'est un peu plus long que la solution de Jex.


"Tatanka" a écrit dans le message de news:
eUJ%
Là ça me semble OK.
Un peu tard mais il fallait que j'y arrive ;-)

Pour des cellules formatées « texte » :
Sub Quatre_Espace_Quatre()
Dim c As Range
Dim texte$, der$
For Each c In Selection
texte = Replace(Replace(c.Value, Chr(160), ""), Chr(32), "")
For i = 1 To Len(texte) Step 4
der = der & Mid(texte, i, 4) & " "
Next i
c.Value = Trim(der)
der = ""
Next c
End Sub

Serge



"Tatanka" a écrit dans le message de news:
%
Sub Quatre_Espace_Quatre()
Dim c As Range
For Each c In Selection
c.Value = Trim(Application.Substitute(c.Value, Chr(160), ""))
Next c
End Sub



Toutes mes excuses, cette macro ne tient pas la route.

Serge






Avatar
manbas
Bonjour MichDenis
Je te remercie beaucoup pour ta réponse. Pas de probleme ça fonctionne,
c'est très rapide, autant que la solution de Jex.
A bientôt

"michdenis" a écrit dans le message de news:

Tu pourrais utiliser une macro comme celle-ci en adaptant
le nom de la feuille, la plage de cellules occupées et remplacer
25 par le nombre maximum d'espaces que tu peux retrouver
entre 2 séries de chiffres. Comme l'exécution de cette procédure
est très rapide, au lieu de 25, tu peux mettre 50 si tu le désires...

'---------------------------------------
Sub test()
Dim X As Integer

Application.EnableEvents = False
Application.ScreenUpdating = False
With Worksheets("Feuil1")
With .Range("A1:g5")
Do While X <= 25
.Replace " ", " "
X = X + 1
Loop
End With
End With
Application.EnableEvents = True
Application.ScreenUpdating = True

End Sub
'---------------------------------------



"manbas" a écrit dans le message de groupe de
discussion :

Bonjour michdenis
Merci pour ta réponse.
La solution n'est pas optimale à cause de la longueur des chaines de 4
chiffres. Rien que pour compter le nombre de séquences de 4 chiffres de la
plus grande... et laquelle est la plus grande sur plusieurs centaines de
lignes...

"michdenis" a écrit dans le message de news:

Bonjour,

Essaie quelque chose dans le genre :
Tu adaptes le nom de la feuille, plage de cellules.
Tu peux ajouter des #### autant que tu désires
selon la chaîne de caractères la plus longue que tu as

'--------------------------------
Sub test()
With Worksheets("Feuil1")
With .Range("A1:A10")
.Replace " ", ""
.NumberFormat = "####"" ""####"" ""####"" ""####"" ""####""
""####"
End With
End With
End Sub
'--------------------------------



"Jacques RAGNI" a écrit dans le message de groupe de
discussion :

Bonjour à tous
Mon fichier comporte des centaines de lignes qui reçoivent des codes de
chiffres. Ces codes sont constitués par des chaines de 4 chiffres
séparées
par 1 espace. Par exemple: 0125 7458 6589 0012 5681 etc. Certains sont
très
longs.
Mon problème c'est que certains d'entre eux sont pollués par des espaces
surnuméraires: au lieu d'un espace entre 2 séquences de 4 chiffres, il y
en
a 2, 3, 4, ou plus.
Exemple: 0125 7458 6589 0012 5681
Impossible de déterminer une règle de survenue, certains ont une
anomalie,
d'autres en ont plusieurs.
Ces chaines de caractères sont au format "texte" car leur création s'est
faite à partir de valeurs intégrant les zéros "devant" pour garder la
séquence de 4 chiffres.
Je sais repérer ces chaines anormales en vba (activecell.value="*# *")
ce
qui me permet de les colorer, mais je n'ai pas d'idée pour essayer de les
corriger.
Avez-vous une solution pour m'aider SVP?
En vous remerciant mille fois par avance...




1 2