web-dev-qa-db-fra.com

Comment puis-je effectuer une recherche de chaîne inversée dans Excel sans utiliser VBA?

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!
150
e.James

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'origine
SUBSTITUTE(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," ",""))))))
193
BradC

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.

77
Jerry Beaucaire

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.

19
Joe Finkle

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 ...

12
Jon

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)))}
2
gabrielu

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)

2
Andrew B
=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é.

2
Mark Main
=RIGHT(A1,LEN(A1)-FIND("`*`",SUBSTITUTE(A1," ","`*`",LEN(A1)-LEN(SUBSTITUTE(A1," ",""))))) 
2
Brad
=LEFT(A1,FIND(IF(
 ISERROR(
  FIND("_",A1)
 ),A1,RIGHT(A1,
  LEN(A1)-FIND("~",
   SUBSTITUTE(A1,"_","~",
    LEN(A1)-LEN(SUBSTITUTE(A1,"_",""))
   )
  )
 )
),A1,1)-2)
1
J.B.

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 FINDing 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.

1
Ralf

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,"\",""))))))
0
Marcelo

Copier dans une colonne, sélectionnez cette colonne et HOME> Édition> Rechercher et sélectionner, remplacer:

Find what:

Replace All.

Il y a un espace après l'astérisque.

0
pnuts

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

 enter image description here

0