Trouver le premier espace situé AVANT le Xème caractère d'une suite

baptistec

XLDnaute Nouveau
Bonjour,

D'abord merci infiniment à toutes les personnes qui déjà alimentés ce site (et notamment son forum), qui est une véritable mine d'or ! :)

J'ai besoin de découper le texte positionné dans une cellule en morceaux d'un maximum de 20 caractères. Toute ma difficulté est de réussir à gérer cette césure au niveau des espaces.

Soit le texte de ma cellule A1 :
Le tas de riz tentant tenta le rat tenté qui tâta le tas de riz tentant.

Avec la formule LEFT(A1,20) en cellule A2, je récupère les 20 premiers caractères de la cellule A1, à savoir :
Le tas de riz tentan

Mais j'aimerai en fait récupérer au maximum les 20 premiers caractères de la cellule A1 avant le dernier espace, donc en fait obtenir dans mon exemple :
Le tas de riz

Le problème est de calculer la position du dernier espace dans une série :
SEARCH(" ",A1,1) donne "3" car le premier espace de la série est situé troisième position.
SEARCH(" ",A1,20) donne "22" car le premier espace de la série situé après le 20ème caractère est placé en vingt-deuxième position.

J'ai en fait besoin de trouver le premier espace situé avant le 20ème caractère.

J'ai trouvé ici un script permettant de faire une sorte de césure, mais n'y-a il pas une formule pour ça ?

Merci d'avance de votre aide.
 

Staple1600

XLDnaute Barbatruc
Re : Trouver le premier espace situé AVANT le Xème caractère d'une suite

Bonsoir


Si en A1
Le tas de riz tentant tenta le rat tenté qui tâta le tas de riz tentant.
=STXT(A12;20;1) renvoie le dernier n de tentant


=CODE(STXT(A1;22;1)) renvoie 32 (donc un espace)
 
Dernière édition:

Tibo

XLDnaute Barbatruc
Re : Trouver le premier espace situé AVANT le Xème caractère d'une suite

Bonjour,

Si j'ai bien compris ta demande, cette formule devrait te retourner le rang de l'espace qui précède le 20ème caractère :

Code:
=TROUVE("µ";SUBSTITUE(GAUCHE(A1;20);" ";"µ";NBCAR(GAUCHE(A1;20))-
NBCAR(SUBSTITUE(GAUCHE(A1;20);" ";""))))

Je te laisse tester

@+
 

tototiti2008

XLDnaute Barbatruc
Re : Trouver le premier espace situé AVANT le Xème caractère d'une suite

Bonjour à tous,

juste pour montrer que j'essaie de me mettre aux formules matricielles :)
 

Pièces jointes

  • Classeur1.xls
    13.5 KB · Affichages: 197
  • Classeur1.xls
    13.5 KB · Affichages: 213
  • Classeur1.xls
    13.5 KB · Affichages: 204

abcd

XLDnaute Barbatruc
Re : Trouver le premier espace situé AVANT le Xème caractère d'une suite

Bonjour,

Le texte en A1.
=GAUCHE(A1;CHERCHE("µ";SUBSTITUE(GAUCHE(A1;20);" ";"µ";NBCAR(GAUCHE(A1;20))-NBCAR(SUBSTITUE(GAUCHE(A1;20);" ";"")))))

NBCAR(GAUCHE(A1;20))-NBCAR(SUBSTITUE(GAUCHE(A1;20);" ";"")
compte le nombre d'espaces dans les vingt premiers caractères de A1

SUBSTITUE(GAUCHE(A1;20);" ";"µ";NBCAR(GAUCHE(A1;20))-NBCAR(SUBSTITUE(GAUCHE(A1;20);" ";"")))
remplace le dernier espace par µ

Cherche(...
renvoie la position de µ

=GAUCHE(A1;CHERCHE("µ"; ...
extrait de A1 à partir de la gauche jusqu'à µ

abcd
 

job75

XLDnaute Barbatruc
Re : Trouver le premier espace situé AVANT le Xème caractère d'une suite

Bonsoir à tous,

A mon tour avec une fonction macro (à placer dans un module) :

Code:
Function F$(txt$, x%)
For i% = x - 1 To 1 Step -1
If Mid(txt, i, 1) = " " Then Exit For
Next
F = Left(txt, i - 1)
End Function

Si le texte est en A1, écrire par exemple dans une autre cellule :

=F(A1;20)

Edit : bien sûr, on peut remplacer le 20 par un autre nombre entier...

A+
 
Dernière édition:

Tibo

XLDnaute Barbatruc
Re : Trouver le premier espace situé AVANT le Xème caractère d'une suite

re,

Je te joins un fichier que j'avais commis pour Arnold, qui était passé ici il y a quelques temps, avec une question très similaire et qui consistait à "découper" plusieurs phrases en tronçons de x caractères.

Voir le fichier

@+
 

Pièces jointes

  • arnold.zip
    6.5 KB · Affichages: 176

baptistec

XLDnaute Nouveau
Re : Trouver le premier espace situé AVANT le Xème caractère d'une suite

Waoouuu ! Merci à tous pour vos excellentes réponses avec une réactivité vraiment impressiante !

Vu que mon document utilisé déjà des macros, j'ai opté pour le script de job75.
 

Lii

XLDnaute Impliqué
Re : Trouver le premier espace situé AVANT le Xème caractère d'une suite

Bonsoir Tous,

quelle réponse attends-tu avec la phrase :
"Le tas de riz blanc tentant tenta le rat tenté qui tâta le tas de riz tentant. "?
Si c'est encore "Le tas de riz", la fonction de Job75 fonctionne encore.
Si c'est "Le tas de riz blanc" essaie :
Code:
Function extrait$(texte$, y%)
  n$ = Left(texte, y)
  Do
    For i% = 1 To y
      If Len(extrait) = y - 1 Then Exit Do
      If Left(Right(n, Len(n) - i), 1) = " " Then nb = i: Exit For
    Next
    texte1 = Left(n, i)
    extrait = extrait & texte1
    n = Right(n, Len(n) - nb)
    nb = 0
  Loop While Len(extrait) - 1 < y
End Function
 

Pièces jointes

  • SousChaine(VBA).zip
    7.1 KB · Affichages: 91

tototiti2008

XLDnaute Barbatruc
Re : Trouver le premier espace situé AVANT le Xème caractère d'une suite

Bonjour à tous,

pour les adeptes de VBA, je leur fait remarquer qu'il existe une fonction InStrRev qui je pense leur permettrait d'éviter les boucles sur la chaine de texte.
C'était juste pour info...
 

Lii

XLDnaute Impliqué
Re : Trouver le premier espace situé AVANT le Xème caractère d'une suite

Bonjour Tous,

Je sentais bien qu'on aurait une proposition plus simple !
Merci tototiti2008.
Avec cette fonction que je n'avais pas trouvée, batistec pourrait peut-être se contenter de
Code:
Function extrait$(texte$, y%)
  extrait = Left(Range("A1"), InStrRev(Left(Range("A1"), y), " "))
End Function
 

mitou

XLDnaute Nouveau
Re : Trouver le premier espace situé AVANT le Xème caractère d'une suite

1. Je cherche une aide. Dans un fichier j'ai une colonne de désignations qui peuvent atteindre 80 caractères (des mots, des chiffres, des espaces...). Je souhaite répartir ces désignations sur plusieurs colonnes de 30 caractères max sans que le dernier mot de chaque cellule soit coupé (il faut qu'il bascule dans la colonne suivante). Est-ce que quelqu'un peut m'indiquer la marche à suivre.
exemple de de désignation : SEMELLE VIBRAM GARMONT XENA TAILLE 24/24,5=38/38,5 277mm EN STOCK
Je souhaiterais SEMELLE VIBRAM GARMOND (en A1) ZENA TAILLE 24/24,5=38/38,5 277 MMM (en B1) EN STOCK (en C1)
 

CISCO

XLDnaute Barbatruc
Re : Trouver le premier espace situé AVANT le Xème caractère d'une suite

Bonsoir

Une possibilité en pièce jointe, malheureusement pas totalement polyvalente.

@ plus
 

Pièces jointes

  • concatener.xlsx
    10.1 KB · Affichages: 118
  • concatener.xlsx
    10.1 KB · Affichages: 128
  • concatener.xlsx
    10.1 KB · Affichages: 130
Dernière édition:

JNP

XLDnaute Barbatruc
Re : Trouver le premier espace situé AVANT le Xème caractère d'une suite

Bonsoir le fil :),
Histoire de réveiller Jean-Marie, un petit RegExp :p...
Code:
Function Découpe(Chaine As String, NbreCaractères As Integer, Position As Integer) As String
Dim Match
Application.Volatile
With CreateObject("vbscript.regexp")
    .Global = True
    .Pattern = ".{1," & NbreCaractères & "}\b"
    Set Match = .Execute(Chaine)
    If Match.Count >= Position Then
        Découpe = Match(Position - 1)
    End If
End With
End Function
Voir PJ ;).
J'ai pas recalculé tous les caractères, peut-être à affiner :rolleyes:...
A noter que les () peuvent être mal découpées, mais on a bien parlé de mots :p...
Bonne nuit :cool:
 

Pièces jointes

  • Découpe.xls
    35 KB · Affichages: 144
Dernière édition:

JNP

XLDnaute Barbatruc
Re : Trouver le premier espace situé AVANT le Xème caractère d'une suite

Re :),
J'ai pas recalculé tous les caractères, peut-être à affiner :rolleyes:...
A noter que les () peuvent être mal découpées, mais on a bien parlé de mots :p...
Après un petit affinage, ne pose plus de problème avec une fin numérique ou une parenthèse, envoie le nombre de caractère pile poil sans mettre de blancs autour :p...
Code:
Function Découpe(Chaine As String, NbreCaractères As Integer, Position As Integer) As String
Dim Match
Application.Volatile
Chaine = " " & Chaine & " "
With CreateObject("vbscript.regexp")
    .Global = True
    .Pattern = " .{1," & NbreCaractères & "}(?= )"
    Set Match = .Execute(Chaine)
    If Match.Count >= Position Then
        Découpe = Trim(Match(Position - 1))
    End If
End With
End Function
Bonne journée :cool:
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 505
Messages
2 089 070
Membres
104 020
dernier inscrit
Mzghal