extraction du dernier mot d'une chaîne de caractères

  • Initiateur de la discussion Initiateur de la discussion andré
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

A

andré

Guest
Salut à vous tous,

C'est dimanche, et je ne suis pas bien reveillé (lol) !

Je ne me souviens plus comment on extrait le dernier mot d'une chaîne de caractères.
Exemple : "C'est aujourd'hui dimanche " devrait me renvoyer "dimanche" (sans les guillements) - 3 mots et 2 espaces
Mais "Et demain ce sera lundi" devrait renvoyer "lundi" - 5 mots et 4 espaces.

Quelqu'un peut-il me rafraîchir la mémoire ?

Ândré.
 
Bonjour André

Une solution tiré par les cheveux, en formule matricielle

=STXT(A2;MAX(SI(ESTERREUR(CHERCHE(" ";A2;LIGNE(DECALER(A1;;;NBCAR(A2)))));0;CHERCHE(" ";A2;LIGNE(DECALER(A2;;;NBCAR(A2))))))+1;NBCAR(A2))

Pour diminuer la longueur de la formule

=STXT(A2;MAX(SI(ESTERREUR(CHERCHE(" ";A2;LIGNE(A$1:A$32767)));0;CHERCHE(" ";A2;LIGNE(A$1:A$32767))))+1;NBCAR(A2))

@+Jean-Marie
 
Bonjour à Toi Ândré, au Forum, aux buveurs et buveuses de Duvel qui se réveillent lentement le Dimanche !! lol

Bon comme tu pourras t'en douter moi je ole fais en VBA !!

Option Explicit
Sub ExtractionDansStringSPLIT()
Dim TheString As String, TheLastMot As String
Dim contenu As Variant

   TheString = "C'est aujourd'hui dimanche"
   contenu = Split(TheString, Chr(32))
   TheLastMot = contenu(UBound(contenu))

MsgBox "Le dernier mot est : " & TheLastMot
End Sub

Sub ExtractionDansString_SANS_SPLIT()
Dim TheString As String, TheLastMot As String
Dim Y As Byte, X As Integer

  TheString = "Et demain ce sera lundi"
   Y = Len(TheString)
      For X = Y To 1 Step -1
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If Mid(TheString, X, 1) <> Chr(32) Then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TheLastMot = Mid(TheString, X, 1) & TheLastMot
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit For
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End If
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Next X

MsgBox "Le dernier mot est : " & TheLastMot
End Sub


Mais comme je sais que tu devras l'utiliser en Fonction, voici les Mêmesen Fonction Personnalisées utilisable depuis une cellule =LASTWORD(A1)

Function LASTWORD(ByRef Cell As Range)
Dim TheString As String, TheLastMot As String
Dim contenu As Variant
Application.Volatile

&nbsp;&nbsp;TheString = Cell.Value
&nbsp;&nbsp;contenu = Split(TheString, Chr(32))
&nbsp;&nbsp;TheLastMot = contenu(UBound(contenu))

LASTWORD = TheLastMot
End Function


Function DERMOT(ByRef Cell As Range)
Dim TheString As String, TheLastMot As String
Dim Y As Byte, X As Integer
Application.Volatile

&nbsp;&nbsp;TheString = Cell.Value

&nbsp;&nbsp;&nbsp;Y = Len(TheString)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;For X = Y To 1 Step -1
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If Mid(TheString, X, 1) <> Chr(32) Then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TheLastMot = Mid(TheString, X, 1) & TheLastMot
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit For
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End If
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Next X

DERMOT = TheLastMot
End Function

La différence entre c'est quatres possibilités réside dans le Fait que seule la seconde et la quatrième sont compatible Excel 97 (SPLIT n'existant pas pour cette version)

Bon Dimanche
@+Thierry
 
Bonjour Ti, re Jean Marie, Ândré, le Forum

Merci Ti, je viens de faire connaissance avec "InStrRev, fonction" (Renvoie la position d'une occurrence d'une chaîne dans une autre, à partir de la fin de la chaîne.) qui évidemment fait gagner du temps et de la simplicité dans ce genre de cas.

Par contre çà me retourne un espace de trop devant la string retournée, donc j'ai modifié ainsi :
Function LASTWORD$(ByVal Mot$)
On Error Resume Next
LASTWORD = Mot
LASTWORD = Mid(LASTWORD, InStrRev(LASTWORD, " ") + 1)
End Function

Mais merci pour le "Instr Reversed" et aussi pour ta structure de Function (comme tu sais je n'en fais jamais et j'ai tord lol)
Bon Appétit
@+Thierry
 
Exact Thierry, pour l'espace, ça m'apprendra à ne pas tester avant !

Et puis pour le passage de paramètres, quoique l'aide d'Excel recommande des passages de paramètres par référence et non par valeurs, je recommande, moi de les passer par valeur chaque fois qu'on veut utiliser une fonction dans une feuille de calcul (mais pas seulement). Ainsi le transtypage, s'il est nécessaire, se fait automatiquement et on ne risque plus d'erreur

Ex : si j'écris MsgBox LastWord(123)
je n'aurai pas d'erreur parce que 123 est automatiquement converti en chaine de caractères, alors que si ma fonction avait été déclarée :

Function LastWord$(Mot$)

la précédente écriture aurait déclenché une erreur
 
Salut à vous tous, JM et Th^2 (lol),

En voilà du succès pour une question qui semble bien simple, mais avec des réponses bien compliquées !

Me connaissant, vous savez que je cherche une formule.
Merci quand même pour l'approche en VBA, cela pourra certainement en aider d'autres.

J'étais parti sur une autre idée :
compter le nombre d'espaces, supprimer les (n-1) premiers, puis extraire ce qui suit l'espace restant : je n'y parviens pas.
ou bien :
chercher à partir de la droite l'emplacement du premier espace, puis extraire, toujours à partir de la droite ce nombre de caractères -1 : je n'y parviens pas plus !

Pourtant je sens que c'est bien ainsi que je trouverais une formule simple.
Mais Monique, Celeda et C@thy ne sont pas encore passées.
En les attedant je continue à chercher.

Merci quand même pour vos interventions.
A bientôt j'espère (avec une petite formule toute simple ...).
Ândré.
 
Me voilà de retour avec une solution !

Peut-être pas plus simple que celle de Jean-Marie, mais pas tirée par les cheveux, et pas matricielle !

Le texte en A1.
La formule : =DROITE(A1;NBCAR(A1)-CHERCHE("µ";SUBSTITUE(A1;" ";"µ";NBCAR(A1)-NBCAR(SUBSTITUE(A1;" ";"")));1))

Ce que j'ai fait :
J'ai compté le nombre d'espaces : =NBCAR(A1)-NBCAR(SUBSTITUE(A1;" ";""))
J'ai remplacé le dernier espace (position donnée par la formule précédente) par un caractère très peu utilisé (µ) : =SUBSTITUE(A1;" ";"µ";no_position)
J'ai cherché la position de ce caractère : =CHERCHE("µ";...;1)
J'extrais à partir de la droite un nombre de caractères égal au nombre de caractère de la chaîne de texte - la position du caractère peu utilisé (µ) : =DROITE(A1;NBCAR(A1)-CHERCHE(...))

Ce n'est pas plus compliqué que cela !
Cela ne m'étonne pas que je ne m'en souvenais pas du premier coup (lol).

Bonne fin de dimanche à vous, et encore merci de l'intérêt que vous avez porté à ma petite question toute simple !
Ândré.
 
Salut Monique,

Exact, elle fonctionne aussi (lol), elle est un peu plus courte, mais matricielle.

Comme je dois appliquer un NB.SI sur la formule, la combiner avec une autre condition et puis la placer dans une mise en forme conditionnelle (c'est pas peu !), j'aurais tendance à préférer la mienne.

Je tiens toutefois à te remercier pour la piste, je vais décortiquer cette formule et voir si je ne peux pas en tirer une simplification pour la mienne.

Il me semblait bien que je pouvais compter sur toi.
A bientôt.
Ândré.
 
une autre fonction matricielle, à peine différente de celle de Jean-Marie :

=STXT(A3;MAX(LIGNE(DECALER(A3;;;NBCAR(A3)))*((STXT(A3;LIGNE(DECALER(A3;;;NBCAR(A3)));1)=" ")*1))+1;NBCAR(A3))

comme celle de Jean-Marie, l'avantage de celle-ci sur celle d'André et de Monique, est qu'elle ne renvoie pas de valeur d'erreur s'il n'y a pas d'espace, sans test supplémentaire (mais il en faut tout de même un pour tester si la cellule est vide ou non)
 
Salut Ti, Monique, @+Thierry, Jean-Marie et à tous ceux qui suivent ce fil,

Ti, tu as presque tout à fait raison.
Ta formule matricielle est bonne, sauf qu'elle renvoie #REF! quand la cellule est vide.

La formule matricielle que Monique a si gentillement mentionnée présente aussi des lacunes : #REF! quand la cellule est vide et #N/A lorsqu'il n'y a pas d'espace dans le texte testé.

La formule matricielle de Jean-Marie est (tout simplement) parfaite !

Je n'ai pas testé la macro de @+Thierry, mais elle doit aussi normalement
être bonne (lol).

Voici ma formule non matricielle corrigée :
=SI(NBCAR(A1)=0;"";SI(NBCAR(A1)=NBCAR(SUBSTITUE(A1;" ";""));A1;DROITE(A1;NBCAR(A1)-CHERCHE("µ";SUBSTITUE(A1;" ";"µ";NBCAR(A1)-NBCAR(SUBSTITUE(A1;" ";"")));1))))

Une petite pièce jointe pour résumer l'ensemble.

Merci encore à tous de votre dévouement.
Ândré.
 

Pièces jointes

- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Assurez vous de marquer un message comme solution pour une meilleure transparence.

Discussions similaires

A
Réponses
14
Affichages
1 K
Jean-Marie
J
Retour