Microsoft 365 Comment remplacer des espaces en trop par un retour à la ligne ? (avec une formule)

Automatik

XLDnaute Nouveau
Bonjour tout le monde,

Je fais de nouveau appel à vous car j'ai un problème.

J'ai des cellules dans lesquelles il y a de nombreux espaces entre des mots.
Cela a été fait parce que la personne ne savait pas faire de retour à la ligne.
Sauf que moi quand je récupère ces cellules évidemment ça me remet tous les espaces, et comme mes cellules ne font pas la même taille je suis obligé de les supprimer moi-même et de remplacer par un retour à la ligne ?

J'ai essayé avec: SUPPRESPACE et CAR(10) mais je n'arrive pas à les mettre en lien...

Quelqu'un connaîtrait-il la solution ?

Alban
 

Pièces jointes

  • Exemple.xlsx
    11.1 KB · Affichages: 11
Dernière édition:
Solution
Bonjour le fil, le forum

une proposition en formule, à partir de 3 espaces successifs, pour intégrer les erreurs possibles de saisie à 2 espaces. Les espaces d'erreur de saisie sont traités par le SUPPRESPACE.
Traite de 3 jusqu'à 362 espaces consécutifs pour un retour à la ligne.
VB:
=SUBSTITUE(SUBSTITUE(SUBSTITUE(SUBSTITUE(SUBSTITUE(SUBSTITUE(SUPPRESPACE(SUBSTITUE(A4;"   ";"|"));"|||||";"|");"||||";"|");"|||";"|");"||";"|");"| ";"|");"|";CAR(10))

Cordialement, @+

[édition : petite amélioration de la formule]

1663063578086.png

Automatik

XLDnaute Nouveau
sans macro. je ne sais pas faire..
par macro. ca donne ca
VB:
Sub test2()
Chaine = Range("A1") 'on récupère la chaine à traiter

For i = 1 To Len(Chaine) 'pour chaque caractère de la chaine
    If Mid(Chaine, i, 1) = " " And Mid(Chaine, i + 1, 1) = " " Then 'si le caractère i ET le caractère sont des espaces
        j = i
        While Mid(Chaine, j, 1) = " " 'on continue de parcourir jusqu'à trouver le dernier espace de la série
            j = j + 1
        Wend
        Chaine= Replace(Chaine, Mid(Chaine, i, j - i), Chr(10)) 'on remplace toute la série par un retour chariot
    End If
Next i

Range("B1") = Chaine
End Sub
Ok, merci ça me fera une solution de secours, j'utilise fichier sur un SharePoint c'est pour ça que je ne cherchais pas de macros. Si jamais je n'ai pas de formule j'enregistrerai le fichier sur mon bureau pour y ajouter la macro, ça me fera gagner du temps déjà.
Merci d'avoir pris le temps de faire ça.
Bonne journée
 

fanch55

XLDnaute Barbatruc
Salut,
C'est ce qui se rapproche le plus de ce que je cherche mais j'aimerais que ça agisse seulement quand dans le texte il y a plusieurs espaces. Je te mets l'exemple tu vas comprendre direct.
D'après l'exemple fourni, je dirai que par formule, ce n'est pas possible et par macro, c'est coton car il faut analyser le contenu pour avoir le projet, son adresse et le cp sans avoir à priori de règle de saisie ...
Comment déterminer que les "n" espaces présents ( ou saisis ) correspondent à un "retour à la ligne" ?
 

Lolote83

XLDnaute Barbatruc
Bonjour à tous,
D'après le fichier fourni au post#13.
Voici une petite macro qui pourrait le faire
VB:
Sub TestRetourLigne()
    xCpt = 0
    xChaine = [A4]
    xDecoupe = Split(xChaine, "  ")
    For F = 0 To UBound(xDecoupe)
        If xDecoupe(F) <> Empty Then
            xCpt = xCpt + 1
            If xCpt = 1 Then
                xResult = xResult & xDecoupe(F)
            Else
                xResult = xResult & Chr(10) & LTrim(xDecoupe(F))
            End If
        End If
    Next F
    [D4] = xResult
End Sub
@+ Lolote83
 

vgendron

XLDnaute Barbatruc
Toutes les propositions
toutes ??? as tu essayé la macro?

j'en profite pour en poster une correction avec des commentaires
VB:
Sub test2()
tabvaleur = Range("A2:A3").Value 'on récupère les données à traiter
For num = LBound(tabvaleur, 1) To UBound(tabvaleur, 1) 'pour chaque donnée
    valeur = tabvaleur(num, 1) 'on initialise la "valeur"
    
    For i = 1 To Len(valeur) 'pour chaque caractère
        If Mid(valeur, i, 1) = " " And Mid(valeur, i + 1, 1) = " " Then 'si le caractère et son suivant sont des espaces
            j = i 'on note l'indice du premier espace
            While Mid(valeur, j, 1) = " " 'on parcourt les caractères suivants tant qu'il s'agit d'un espace
                j = j + 1
            Wend
            valeur = Replace(valeur, Mid(valeur, i, j - i), Chr(10), 1, 1) 'on remplace la suite d'espace qu'on vient d'identifier. et SEULEMENT cette suite
        End If
    Next i
    tabvaleur(num, 1) = valeur 'on met à jour le tableau avec la valeur modifiée
Next num
Range("B2").Resize(UBound(tabvaleur, 1), UBound(tabvaleur, 2)) = tabvaleur 'on colle le résultat en colonne B
End Sub
 
Dernière édition:

vgendron

XLDnaute Barbatruc
ha bah oui, mais là, si les gens ne sont pas capables d'écrire en Français.. on ne peut plus rien pour eux...
Soit notre ami se tape les corrections à la main, soit il impose un contrôle de saisie dans le document d'origine...
et si en plus il faut ouvrir les 10 fichiers envoyés à chaque post.. on est pas sorti
 

Lolote83

XLDnaute Barbatruc
Bonjour à tous.
@fanch55 a dit :
Par exemple, il y a 2 espaces entre nom et du projet ...
Effectivement, c'est difficile de contrôler la saisie des utilisateurs. Mais comme le dit @vgendron
ha bah oui, mais là, si les gens ne sont pas capables d'écrire en Français..
Cependant, en imaginant qu'il arrive que l'on saisisse par erreur 2 espaces, soit, mais 3 c'est vraiment le faire exprès. Du coup, j'ai corrigé ma macro du post#21 en mettant 3 espaces. On pourrait même pousser le bouchon avec 4 espaces ....

La cellule a testée est en A4 et le résultat sera en B4
VB:
Sub TestRetourLigne()
    xCpt = 0
    xChaine = [A4]
    xDecoupe = Split(xChaine, "   ")    '3 espaces
    For F = 0 To UBound(xDecoupe)
        If xDecoupe(F) <> Empty Then
            xCpt = xCpt + 1
            If xCpt = 1 Then
                xResult = xResult & xDecoupe(F)
            Else
                xResult = xResult & Chr(10) & LTrim(xDecoupe(F))
            End If
        End If
    Next F
    [D4] = xResult
End Sub
Ca donne un résultat qui correspond pas mal. Non !!!!
@+ Lolote83
 

Lolote83

XLDnaute Barbatruc
En complément de mon post#27
On pourrait aussi en faire une fonction personnalisée.
Une fois l'intégralité des cellules modifiée, faire un Copier-Coller les valeurs et le tour est joué.
Du coup, c'est au choix.
VB:
Function TestRetourLigne(xCell)
    xCpt = 0
    xChaine = xCell
    xDecoupe = Split(xChaine, "   ")    '3 espaces
    For F = 0 To UBound(xDecoupe)
        If xDecoupe(F) <> Empty Then
            xCpt = xCpt + 1
            If xCpt = 1 Then
                xResult = xResult & xDecoupe(F)
            Else
                xResult = xResult & Chr(10) & LTrim(xDecoupe(F))
            End If
        End If
    Next F
    TestRetourLigne = xResult
End Function
Je pense du coup que notre ami @Automatik à le choix parmi tout ce qui a été proposé. Bonne chance.
@+ Lolote83
 

Staple1600

XLDnaute Barbatruc
Bonjour le fil

[Retour d'expérience]
Cela ressemble fort à...
Ma-mon collègue qui mets des espaces dans ses cellules pour qu'à l'écran ou à l'impression, cela rende "bien"
Que par exemple, le bloc adresse soit "pile poil" raccord avec la fenêtre transparente de l'enveloppe...etc
Et quand j'ose lui suggérer un conseil, il m'est répondu
"On a toujours fait comme cela!"
Quand je suis arrivé dans le service en 1983, c'est Micheline qui m'a appris"

NB: J'ai pas connu Micheline, mais si cela avait été le cas, je lui aurai parlé d'une base Excel bien proprette et d'un document Word de publipostage
Mais je suis pas loin de penser qu'aussitôt Micheline m'aurait répondu :" Ah mais non, quand je suis entré en 1981, Colette m'a montré comment rédiger le document sur WordStar l'imprimer puis ensuite l'insérer dans la machine à écrire pour taper l'adresse !!!
[/Retour d'expérience]

Pour revenir à 2022 et à la question, je suggère Excel+Word Publipostage, comme une piste à étudier
(ce qui permet d'avoir des documents "normalisés" et "automatisés")

NB: Sinon, j'allais faire comme mapomme (que je salue au passage (*)) mais en plus "guedin", tout en raccourcis clavier
(de A à Z)
Mais c'était trop long à formaliser

(*) je salue aussi les vieux de la vieille qu'on croise dans ce fil
(Ils se reconnaitront ;))
 

Discussions similaires

Statistiques des forums

Discussions
312 164
Messages
2 085 877
Membres
103 009
dernier inscrit
dede972