Как я могу выполнить поиск обратной строки в Excel без использования VBA? - PullRequest
152 голосов
/ 08 декабря 2008

У меня есть таблица Excel, содержащая список строк. Каждая строка состоит из нескольких слов, но количество слов в каждой строке отличается.

Используя встроенные функции Excel (без VBA), есть ли способ выделить последнее слово в каждой строке?

Примеры:

  Are you classified as human? -> human?
Negative, I am a meat popsicle -> popsicle
                  Aziz! Light! -> Light!

Ответы [ 14 ]

196 голосов
/ 08 декабря 2008

Этот протестирован и работает (основываясь на оригинальном посте Брэда):

=RIGHT(A1,LEN(A1)-FIND("|",SUBSTITUTE(A1," ","|",
     LEN(A1)-LEN(SUBSTITUTE(A1," ","")))))

Если ваши исходные строки могут содержать трубу "|" символ, затем замените оба в вышеупомянутом с другим символом, который не появится в вашем источнике. (Я подозреваю, что оригинал Брэда был сломан, потому что в переводе был удален непечатный символ).

Бонус: как это работает (справа налево):

LEN(A1)-LEN(SUBSTITUTE(A1," ","")) - Количество пробелов в исходной строке
SUBSTITUTE(A1," ","|", ... ) & ndash; Заменяет только final пробел на |
FIND("|", ... ) - Находит абсолютную позицию замененного | (это был последний пробел)
Right(A1,LEN(A1) - ... )) - Возвращает все символы после этого |

РЕДАКТИРОВАТЬ: для учета случая, когда исходный текст не содержит пробелов, добавьте следующее в начало формулы:

=IF(ISERROR(FIND(" ",A1)),A1, ... )

теперь создаем всю формулу:

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

Или вы можете использовать синтаксис =IF(COUNTIF(A1,"* *") другой версии.

Если исходная строка может содержать пробел в последней позиции, добавьте функцию обрезки при подсчете всех пробелов: Сделайте функцию следующей:

=IF(ISERROR(FIND(" ",B2)),B2, RIGHT(B2,LEN(B2) - FIND("|",
    SUBSTITUTE(B2," ","|",LEN(TRIM(B2))-LEN(SUBSTITUTE(B2," ",""))))))
77 голосов
/ 02 марта 2012

Это техника, которую я использовал с большим успехом:

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

Чтобы получить первое слово в строке, просто измените с ПРАВО на ВЛЕВО

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

Также замените А1 на ячейку, содержащую текст.

19 голосов
/ 01 июня 2013

Более надежная версия ответа Джерри:

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

Это работает независимо от длины строки, начальных или конечных пробелов или чего-либо еще, и все еще довольно коротко и просто.

12 голосов
/ 08 декабря 2008

Я нашел это в Google, протестировано в Excel 2003 и у меня работает:

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

[edit] У меня недостаточно репутации, чтобы комментировать, так что это кажется лучшим местом ... Ответ BradC также не работает с конечными пробелами или пустыми ячейками ...
[2nd edit] на самом деле, это не работает и для отдельных слов ...

2 голосов
/ 24 июля 2013

Чтобы добавить к ответам Джерри и Джо, если вы хотите найти текст ДО последнего слова, которое вы можете использовать:

=TRIM(LEFT(SUBSTITUTE(TRIM(A1), " ", REPT(" ", LEN(TRIM(A1)))), LEN(SUBSTITUTE(TRIM(A1), " ", REPT(" ", LEN(TRIM(A1)))))-LEN(TRIM(A1))))

С «Моим маленьким котом» в А1 получилось бы «Мой маленький» (где Джо и Джерри дали бы «кота»

Точно так же, как Джерри и Джо выделяют последнее слово, это просто возвращает все слева от этого (затем обрезает его обратно)

2 голосов
/ 13 мая 2011
=RIGHT(TRIM(A1),LEN(TRIM(A1))-FIND(CHAR(7),SUBSTITUTE(" "&TRIM(A1)," ",CHAR(7),
LEN(TRIM(A1))-LEN(SUBSTITUTE(" "&TRIM(A1)," ",""))+1))+1)

Это очень надежно - оно работает для предложений без пробелов, пробелов в начале / в конце, множественных пробелов, пробелов в начале / в конце ... и я использовал char (7) для разделителя, а не вертикальной черты "| " на всякий случай, это желаемый текстовый элемент.

2 голосов
/ 27 октября 2010

Это очень чистый, компактный и хорошо работает.

{=RIGHT(A1,LEN(A1)-MAX(IF(MID(A1,ROW(1:999),1)=" ",ROW(1:999),0)))}

Это не ошибка ловушки ни для пробелов, ни для одного слова, но это легко добавить.

Edit:
Это обрабатывает завершающие пробелы, одиночные слова и сценарии пустых ячеек. Я не нашел способ сломать это.

{=RIGHT(TRIM(A1),LEN(TRIM(A1))-MAX(IF(MID(TRIM(A1),ROW($1:$999),1)=" ",ROW($1:$999),0)))}
2 голосов
/ 08 декабря 2008
=RIGHT(A1,LEN(A1)-FIND("`*`",SUBSTITUTE(A1," ","`*`",LEN(A1)-LEN(SUBSTITUTE(A1," ",""))))) 
1 голос
/ 01 июля 2016
=LEFT(A1,FIND(IF(
 ISERROR(
  FIND("_",A1)
 ),A1,RIGHT(A1,
  LEN(A1)-FIND("~",
   SUBSTITUTE(A1,"_","~",
    LEN(A1)-LEN(SUBSTITUTE(A1,"_",""))
   )
  )
 )
),A1,1)-2)
1 голос
/ 21 января 2011

Представьте, что строка может быть перевернута. Тогда это действительно легко. Вместо работы со строкой:

"My little cat" (1)

вы работаете с

"tac elttil yM" (2)

С =LEFT(A1;FIND(" ";A1)-1) в A2 вы получаете "My" с (1) и "tac" с (2), которое перевернуто "cat", последнее слово в (1).

Есть несколько VBA, чтобы перевернуть строку. Я предпочитаю публичную функцию VBA ReverseString.

Установите вышеуказанное, как описано. Затем с вашей строкой в ​​A1, например, "My little cat" и этой функцией в A2:

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

вы увидите "cat" в A2.

Приведенный выше метод предполагает, что слова разделяются пробелами. Предложение IF предназначено для ячеек, содержащих отдельные слова = пробелов в ячейке нет. Примечание: TRIM и CLEAN оригинальная строка также полезны. В принципе, он переворачивает всю строку из A1 и просто находит первый пробел в перевернутой строке, которая находится рядом с последним (перевернутым) словом (т.е. "tac "). LEFT выбирает это слово, а другая перестановка строк восстанавливает первоначальный порядок слова (" cat"). -1 в конце оператора FIND удаляет пробел.

Идея состоит в том, что легко извлечь первое (!) Слово в строке с LEFT и FIND с первым пробелом. Однако для последнего (!) Слова функция RIGHT является неправильным выбором, когда вы пытаетесь это сделать, потому что, к сожалению, в FIND нет флага для направления, в котором вы хотите проанализировать вашу строку.

Поэтому вся строка просто перевернута. LEFT и FIND работают как обычно, но извлеченная строка переворачивается. Но это не страшно, если вы знаете, как перевернуть строку. Первый оператор ReverseString в формуле выполняет эту работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...