J'ai une feuille de calcul Excel contenant une liste de chaînes. Chaque chaîne est composée de plusieurs mots, mais le nombre de mots dans chaque chaîne est différent.
À l'aide des fonctions Excel intégrées (pas de VBA), existe-t-il un moyen d'isoler le dernier mot de chaque chaîne?
Exemples:
Êtes-vous classé comme humain? -> humain? Négatif, je suis un popsicle de viande -> popsicle Aziz! Lumière! -> Lumière!
Celui-ci est testé et fonctionne (basé sur le post original de Brad):
=RIGHT(A1,LEN(A1)-FIND("|",SUBSTITUTE(A1," ","|",
LEN(A1)-LEN(SUBSTITUTE(A1," ","")))))
Si vos chaînes d'origine peuvent contenir un tuyau "|" caractère, puis remplacez les deux dans ce qui précède par un autre caractère qui n'apparaîtra pas dans votre source. (Je soupçonne que l'original de Brad était cassé parce qu'un caractère non imprimable avait été supprimé de la traduction).
Bonus: Comment ça marche (de droite à gauche):
LEN(A1)-LEN(SUBSTITUTE(A1," ",""))
- Nombre d'espaces dans la chaîne d'origineSUBSTITUTE(A1," ","|", ... )
- Remplace uniquement l'espace final par un |
FIND("|", ... )
- Trouve la position absolue de ce |
remplacé (qui était l'espace final)Right(A1,LEN(A1) - ... ))
- Retourne tous les caractères après ce |
EDIT: pour prendre en compte le cas où le texte source ne contient pas d'espaces, ajoutez ce qui suit au début de la formule:
=IF(ISERROR(FIND(" ",A1)),A1, ... )
rendant la formule entière maintenant:
=IF(ISERROR(FIND(" ",A1)),A1, RIGHT(A1,LEN(A1) - FIND("|",
SUBSTITUTE(A1," ","|",LEN(A1)-LEN(SUBSTITUTE(A1," ",""))))))
Ou vous pouvez utiliser la syntaxe =IF(COUNTIF(A1,"* *")
de l'autre version.
Lorsque la chaîne d'origine peut contenir un espace à la dernière position, ajoutez une fonction de rognage tout en comptant tous les espaces: Procédez comme suit pour la fonction:
=IF(ISERROR(FIND(" ",B2)),B2, RIGHT(B2,LEN(B2) - FIND("|",
SUBSTITUTE(B2," ","|",LEN(TRIM(B2))-LEN(SUBSTITUTE(B2," ",""))))))
C'est la technique que j'ai utilisée avec un grand succès:
=TRIM(RIGHT(SUBSTITUTE(A1, " ", REPT(" ", 100)), 100))
Pour obtenir le premier mot d'une chaîne, il suffit de passer de DROITE à GAUCHE
=TRIM(LEFT(SUBSTITUTE(A1, " ", REPT(" ", 100)), 100))
Remplacez également A1 par la cellule contenant le texte.
Une version plus robuste de la réponse de Jerry:
=TRIM(RIGHT(SUBSTITUTE(TRIM(A1), " ", REPT(" ", LEN(TRIM(A1)))), LEN(TRIM(A1))))
Cela fonctionne quelle que soit la longueur de la chaîne, des espaces de début ou de fin, ou autre, et reste simple et court.
J'ai trouvé this sur google, testé dans Excel 2003 et cela fonctionne pour moi:
=IF(COUNTIF(A1,"* *"),RIGHT(A1,LEN(A1)-LOOKUP(LEN(A1),FIND(" ",A1,ROW(INDEX($A:$A,1,1):INDEX($A:$A,LEN(A1),1))))),A1)
[modifier] Je n'ai pas assez de rep pour commenter, donc cela semble le meilleur endroit ... La réponse de BradC ne fonctionne pas non plus avec les espaces de fin ou les cellules vides ...
[2nd edit] en fait, cela ne marche pas non plus pour les mots simples ...
Ceci est très propre et compact, et fonctionne bien.
{=RIGHT(A1,LEN(A1)-MAX(IF(MID(A1,ROW(1:999),1)=" ",ROW(1:999),0)))}
Cela ne piège pas les erreurs pour aucun espace ou un mot, mais c'est facile à ajouter.
Modifier:
Cela gère les espaces de fin, les mots uniques et les scénarios de cellules vides. Je n'ai pas trouvé le moyen de le casser.
{=RIGHT(TRIM(A1),LEN(TRIM(A1))-MAX(IF(MID(TRIM(A1),ROW($1:$999),1)=" ",ROW($1:$999),0)))}
Pour ajouter aux réponses de Jerry et Joe, si vous voulez trouver le texte AVANT le dernier mot, vous pouvez utiliser:
=TRIM(LEFT(SUBSTITUTE(TRIM(A1), " ", REPT(" ", LEN(TRIM(A1)))), LEN(SUBSTITUTE(TRIM(A1), " ", REPT(" ", LEN(TRIM(A1)))))-LEN(TRIM(A1))))
Avec 'Mon petit chat' en A1, on obtiendrait 'Mon petit' (où Joe et Jerry donneraient 'chat'
De la même manière que Jerry et Joe isolent le dernier mot, ceci place alors tout à gauche de celui-ci (puis le réduit)
=RIGHT(TRIM(A1),LEN(TRIM(A1))-FIND(CHAR(7),SUBSTITUTE(" "&TRIM(A1)," ",CHAR(7),
LEN(TRIM(A1))-LEN(SUBSTITUTE(" "&TRIM(A1)," ",""))+1))+1)
Ceci est très robuste - cela fonctionne pour les phrases sans espaces, les espaces de début/fin, les espaces multiples, les multiples espaces de début/fin ... et j'ai utilisé char (7) pour le délimiteur plutôt que la barre verticale "|" juste au cas où c'est un élément de texte souhaité.
=RIGHT(A1,LEN(A1)-FIND("`*`",SUBSTITUTE(A1," ","`*`",LEN(A1)-LEN(SUBSTITUTE(A1," ","")))))
=LEFT(A1,FIND(IF(
ISERROR(
FIND("_",A1)
),A1,RIGHT(A1,
LEN(A1)-FIND("~",
SUBSTITUTE(A1,"_","~",
LEN(A1)-LEN(SUBSTITUTE(A1,"_",""))
)
)
)
),A1,1)-2)
Imaginez que la chaîne puisse être inversée. Alors c'est vraiment facile. Au lieu de travailler sur la chaîne:
"My little cat" (1)
vous travaillez avec
"tac elttil yM" (2)
Avec =LEFT(A1;FIND(" ";A1)-1)
en A2, vous obtenez "My"
avec (1) et "tac"
avec (2), qui est inversé "cat"
, le dernier mot de (1).
Il existe quelques VBA pour inverser une chaîne. Je préfère la fonction publique VBA ReverseString
.
Installez ce qui précède comme décrit. Ensuite, avec votre chaîne dans A1, par exemple, "My little cat"
et cette fonction dans A2:
=ReverseString(LEFT(ReverseString(A1);IF(ISERROR(FIND(" ";A1));
LEN(A1);(FIND(" ";ReverseString(A1))-1))))
vous verrez "cat"
en A2.
La méthode ci-dessus suppose que les mots sont séparés par des espaces. La clause IF
concerne les cellules contenant des mots simples = aucun blanc dans la cellule. Remarque: TRIM
et CLEAN
la chaîne d'origine sont également utiles. En principe, il inverse la chaîne entière de A1 et trouve simplement le premier espace dans la chaîne inversée qui est à côté du dernier mot (inversé) (c'est-à-dire, "tac "
). LEFT
choisit ce mot et une autre inversion de chaîne reconstitue l'ordre d'origine du mot (" cat"
). Le -1
à la fin de l'instruction FIND
supprime le blanc.
L'idée est qu'il est facile d'extraire le premier (!) Mot d'une chaîne avec LEFT
et FIND
ing le premier blanc. Cependant, pour le dernier (!) Word, la fonction RIGHT
est un mauvais choix lorsque vous essayez de le faire car, malheureusement, FIND n’a pas d'indicateur pour la direction dans laquelle vous souhaitez analyser votre chaîne.
Par conséquent, toute la chaîne est simplement inversée. LEFT
et FIND
fonctionnent normalement, mais la chaîne extraite est inversée. Mais ce n'est pas grave une fois que vous savez inverser une chaîne. La première instruction ReverseString
de la formule fait ce travail.
J'ai traduit en PT-BR, car j'avais aussi besoin de ça.
(Veuillez noter que j'ai changé l'espace en \
car je n'avais besoin que du nom de fichier des chaînes de chemin.)
=SE(ÉERRO(PROCURAR("\",A1)),A1,DIREITA(A1,NÚM.CARACT(A1)-PROCURAR("|", SUBSTITUIR(A1,"\","|",NÚM.CARACT(A1)-NÚM.CARACT(SUBSTITUIR(A1,"\",""))))))
Une autre manière de réaliser ceci est comme ci-dessous
=IF(ISERROR(TRIM(MID(TRIM(D14),SEARCH("|",SUBSTITUTE(TRIM(D14)," ","|",LEN(TRIM(D14))-LEN(SUBSTITUTE(TRIM(D14)," ","")))),LEN(TRIM(D14))))),TRIM(D14),TRIM(MID(TRIM(D14),SEARCH("|",SUBSTITUTE(TRIM(D14)," ","|",LEN(TRIM(D14))-LEN(SUBSTITUTE(TRIM(D14)," ","")))),LEN(TRIM(D14)))))