Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

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

  • Initiateur de la discussion andré
  • Date de début
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é.
 
J

Jean-Marie

Guest
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
 
@

@+Thierry

Guest
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
 
@

@+Thierry

Guest
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
 
T

Ti

Guest
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
 
A

andré

Guest
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é.
 
A

andré

Guest
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é.
 
A

andré

Guest
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é.
 
T

Ti

Guest
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)
 
T

Ti

Guest
oups, petite correction pour ma formule ci-dessus :

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

toujours en formule matricielle
 
A

andré

Guest
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

  • dernier_mot.zip
    2.8 KB · Affichages: 176

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…