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


165

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.

En utilisant 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 considéré comme humain? -> humain?
Négatif, je suis un popsicle de viande -> popsicle
                  Aziz! Lumière! -> Lumière!

4
Je me demande pourquoi vous avez la contrainte artificielle sans VBA?
EBGreen

3
Je peux facilement le résoudre avec VBA, mais je suis curieux de savoir s'il existe une solution non VBA. VBA a tendance à avoir des pénalités de performances pour les grands ensembles de données.
e.James

Comme d'habitude, deux réponses se démarquent vraiment et j'ai du mal à décider laquelle choisir comme bonne réponse. Dans ce cas, Jon et BradC (avec l'aide de Brad) ont trouvé des solutions correctes et fonctionnelles.
e.James

J'ai choisi la solution de BradC parce qu'elle semble être la plus élégante des deux, et il fournit une explication pratique de la fonction.
e.James

Il est difficile de répondre correctement à votre question si vous n'indiquez pas ce qui rend VBA inapproprié (puisque vous pouvez écrire vos propres macros et fonctions dans VBA, ce qui le rend équivalent aux fonctions intégrées).
dkretz

Réponses:


208

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 tube "|" 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 a été cassé car un caractère non imprimable a été supprimé dans 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 celui remplacé |(qui était l'espace final)
Right(A1,LEN(A1) - ... ))- Renvoie tous les caractères après cela|

EDIT: pour tenir compte du 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, ... )

faire 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 =IF(COUNTIF(A1,"* *")syntaxe de l'autre version.

Lorsque la chaîne d'origine peut contenir un espace à la dernière position, ajoutez une fonction de découpage tout en comptant tous les espaces: Rendre la fonction la suivante:

=IF(ISERROR(FIND(" ",B2)),B2, RIGHT(B2,LEN(B2) - FIND("|",
    SUBSTITUTE(B2," ","|",LEN(TRIM(B2))-LEN(SUBSTITUTE(B2," ",""))))))

1
Je ne peux pas vous remercier assez. J'avais besoin du reste de la chaîne aussi, donc simplement changer = RIGHT en = LEFT et supprimer LEN (A1) - m'a permis d'obtenir le reste. Mais merci d'avoir fait tout le travail initial :)
Luke Duddridge

4
+1: Je vais devoir me souvenir de l'astuce "LEN (A1) -LEN (SUBSTITUTE (A1," "," "))" pour obtenir le nombre d'occurrences d'un personnage
anschauung

2
Excellente solution! Le seul problème est qu'Excel localise les noms de fonction, vous devez donc réécrire la formule pour Excel non anglais. Voici la variante réécrite pour la version russe: = ПРАВСИМВ (A1; ДЛСТР (A1) -ПОИСК ("|"; ПОДСТАВИТЬ (A1; ""; "|"; ДЛСТР (A1) -ДЛСТР (ПОДСТВИТЬ (A1) ""; "")))))
Michael Pliskin

Cette réponse s'arrête sur les chaînes contenant des espaces consécutifs.
somewhatsapient

1
Je recommanderais de diviser les formules en colonnes temporaires (vous pouvez les masquer plus tard). C'est très utile pour déboguer des cas particuliers.
wisbucky

84

C'est la technique que j'ai utilisée avec beaucoup de succès:

=TRIM(RIGHT(SUBSTITUTE(A1, " ", REPT(" ", 100)), 100))

Pour obtenir le premier mot d'une chaîne, changez simplement de DROITE à GAUCHE

=TRIM(LEFT(SUBSTITUTE(A1, " ", REPT(" ", 100)), 100))

Remplacez également A1 par la cellule contenant le texte.


2
Fonctionne pour moi - vient de remplacer le premier " "par mon délimiteur. Les deux 100semblent le limiter à une chaîne de 100 caractères si je ne me trompe pas
Benjineer

1
Si nous utilisons un délimiteur différent, nous devons également le supprimer à la fin, par exemple=TRIM(SUBSTITUTE(RIGHT(SUBSTITUTE(A1, ".", REPT(".", 100)), 100), ".", ""))
dumbledad

7
Méthode très intelligente. Il remplace chaque espace par 100 espaces, puis renvoie les 100 derniers caractères sans espaces de début / de fin.
Zenadix

@Benjineer Je pense que cela fonctionne pour des chaînes de plus de 100 caractères. Les 100 caractères limitent la taille d'un seul mot. Vous prenez la centaine de caractères à droite (ou à gauche) ..... si un mot de 101 caractères vous rencontrait un problème, mais si une chaîne de 100 caractères au total ... avec 3 espaces ... serait rembourré à environ une chaîne de 400 caractères et fonctionne toujours. A Jerry Beaucaire - Très élégant, merci.
Tin Bum

22

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, les espaces de début ou de fin, ou quoi que ce soit d'autre et c'est toujours assez court et simple.


2
C'est une excellente formule. J'ai modifié la formule =TRIM(RIGHT(SUBSTITUTE(TRIM(A1), ".", REPT(" ", LEN(TRIM(A1)))), LEN(TRIM(A1))))pour obtenir l'extension de fichier.
Adarsh ​​Madrecha

2
Un autre lui SUBSTITUTEpermet de fonctionner pour n'importe quel caractère, pas seulement pour les espaces. =TRIM(SUBSTITUTE(RIGHT(SUBSTITUTE(TRIM(A1),"/",REPT("/",LEN(TRIM(A1)))),LEN(TRIM(A1))),"/","")), où "/" est le caractère de délimitation.
PProteus

@Joefinkle, c'est une solution vraiment concise et intelligente. Il fonctionne très bien, pour ne citer que si le delimiter est une chaîne , il ne fonctionne pas bien dans tous les cas, voici un exemple pour un delimiter: " ; "(un point-virgule entouré par des espaces) avec une valeur d'entrée: "Technology Sprint 24 ; Sprint 4"il retourne: "; Sprint 4". J'utilise la solution adaptée par: @PProteus.
David Leal

Si le délimiteur est une chaîne, une solution de contournement possible serait de le remplacer auparavant par un caractère spécial, par exemple en remplaçant dans la formule @PProteus TRIM(A1)par: TRIM(SUBSTITUTE(A1, "strDelimeter", ";"))à tous les endroits, afin d'avoir un nouveau délimiteur de caractère: ";"ou encore mieux en utilisant la char()fonction pour trouver un personnage vraiment inattendu.
David Leal

1
@PProteus vous n'avez pas besoin de la TRIMfonction après avoir ajouté la seconde SUBSTITUTEpour la solution de cas général à caractère unique. La formule fournit le résultat attendu en éliminant cette partie:=SUBSTITUTE(RIGHT(SUBSTITUTE(TRIM(A1),";",REPT(";",LEN(TRIM(A1)))),LEN(TRIM(A1))),";","")
David Leal

13

J'ai trouvé ceci 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 représentants 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 ...
[2ème modification] en fait, cela ne fonctionne pas pour des mots simples non plus ...


Solution la plus proche encore, mais je jetterais un Trim () car un espace de fin le brisera.
EBGreen

Vrai, probablement le plus facile à couper () dans une cellule intermédiaire, puis à appliquer la formule ci-dessus à la cellule intermédiaire. De plus, crache 0 si la cellule est vide, elle peut donc également être enveloppée avec isblank ()
Jon

3
=RIGHT(TRIM(A1),LEN(TRIM(A1))-FIND(CHAR(7),SUBSTITUTE(" "&TRIM(A1)," ",CHAR(7),
LEN(TRIM(A1))-LEN(SUBSTITUTE(" "&TRIM(A1)," ",""))+1))+1)

C'est très robuste - cela fonctionne pour les phrases sans espaces, les espaces de début / de fin, plusieurs espaces, plusieurs espaces de début / de fin ... et j'ai utilisé char (7) pour le délimiteur plutôt que la barre verticale "|" juste au cas où ce serait un élément de texte souhaité.


Fonctionne pour moi dans Excel 2010. Merci
Rudiger Wolf

2

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

Il ne piège pas d'erreur pour aucun espace ou un mot, mais c'est facile à ajouter.

Modifier:
Cela gère les espaces de fin, les scénarios de mot unique et 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)))}

Cool. C'est une utilisation vraiment intéressante des fonctions de tableau! Je ne m'attendais pas à obtenir une autre réponse après si longtemps. Merci pour le partage.
e.James

2
=RIGHT(A1,LEN(A1)-FIND("`*`",SUBSTITUTE(A1," ","`*`",LEN(A1)-LEN(SUBSTITUTE(A1," ",""))))) 

L'avez-vous testé? Cela ne fonctionne pas pour moi avec "Êtes-vous classé comme humain?"
Ed Guiness

Non, ça ne marche pas. A quelques éléments intéressants, cependant. LEN (A1) -LEN (SUBSTITUTE (A1, "", "") vous donne le nombre d'espaces dans la chaîne.
BradC

C'est une fonction intéressante. Dommage que ça ne marche pas. J'aime l'astuce pour pouvoir compter le nombre d'espaces.
e.James

@Brad: J'ai édité votre message pour afficher les caractères *. L'original ne les a pas imprimés correctement. Avec ceux-ci en place, cela fonctionne. +1
e.James

2

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 '' dans A1, cela donnerait `` Mon petit '' (où Joe et Jerry donneraient `` chat ''

De la même manière que Jerry et Joe isolent le dernier mot, cela ramène tout à gauche de cela (puis le rogne)


1

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 VBA publique ReverseString.

Installez ce qui précède comme décrit. Puis avec votre chaîne en A1, par exemple, "My little cat"et cette fonction en A2:

=ReverseString(LEFT(ReverseString(A1);IF(ISERROR(FIND(" ";A1));
  LEN(A1);(FIND(" ";ReverseString(A1))-1))))

vous verrez "cat"dans A2.

La méthode ci-dessus suppose que les mots sont séparés par des blancs. La IFclause est pour les cellules contenant des mots uniques = pas de blanc dans la cellule. Remarque: TRIMet CLEANla chaîne d'origine sont également utiles. En principe, il inverse la chaîne entière à partir de A1 et trouve simplement le premier vide dans la chaîne inversée qui est à côté du dernier mot (inversé) (c'est-à-dire "tac "). LEFTsélectionne ce mot et une autre inversion de chaîne reconstitue l'ordre d'origine du mot ( " cat"). Le -1à la fin de l' FINDinstruction supprime le blanc.

L'idée est qu'il est facile d'extraire le premier (!) Mot d'une chaîne avec LEFTet FINDing le premier blanc. Cependant, pour le dernier mot (!), La RIGHTfonction n'est pas le bon choix lorsque vous essayez de faire cela 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. LEFTet FINDfonctionne normalement mais la chaîne extraite est inversée. Mais ce n'est pas grave une fois que vous savez comment inverser une corde. La première ReverseStringinstruction de la formule fait ce travail.


C'est tellement plus simple que toutes les autres options ici, merci beaucoup !! Pourquoi Find ne peut pas avoir de recherche inversée ou de remplacement - Je semble me souvenir de quelque chose à voir avec l'utilisation d'un nombre négatif pour faire une recherche inversée, mais clairement pas vba ....
Craig Lambie

3
Le PO n'a demandé aucun VBA.
Tripp Kinetics

C'est aussi fou! Si vous envisagez d'utiliser VBA, vous pouvez tout aussi facilement avoir une recherche inversée
Denzil Newman

1
=LEFT(A1,FIND(IF(
 ISERROR(
  FIND("_",A1)
 ),A1,RIGHT(A1,
  LEN(A1)-FIND("~",
   SUBSTITUTE(A1,"_","~",
    LEN(A1)-LEN(SUBSTITUTE(A1,"_",""))
   )
  )
 )
),A1,1)-2)

1

Copiez dans une colonne, sélectionnez cette colonne et ACCUEIL> Edition> Rechercher et sélectionner, remplacer:

Trouver quoi:

Replace All.

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


Notez que * est un caractère générique (gourmand) dans les recherches Excel, donc cela correspond à tout jusqu'au dernier espace et le remplace par rien
Superfly Jon

0

J'ai traduit vers PT-BR, car j'en avais aussi besoin.

(Veuillez noter que j'ai changé l'espace en \parce que j'avais besoin du nom de fichier uniquement 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,"\",""))))))

3
Je ne sais pas comment lire Excel en portugais, donc je vais devoir vous
croire sur

0

Une autre façon d'y parvenir 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)))))

entrez la description de l'image ici


-1

J'avais aussi une tâche comme celle-ci et quand j'ai eu fini, en utilisant la méthode ci-dessus, une nouvelle méthode m'est apparue: pourquoi ne faites-vous pas ceci:

  1. Inversez la chaîne ("string one" devient "eno gnirts").
  2. Utilisez le bon vieux Find (qui est codé en dur pour de gauche à droite).
  3. Inversez-le à nouveau en chaîne lisible.

Comment ça sonne?


12
Sûr. Mais comment inverser la chaîne dans Excel?
e.James
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.