Как я могу выполнить поиск обратной строки в Excel без использования VBA?

165

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

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

Примеры:

  Вы классифицированы как человек? -> человек?
Отрицательный, я эскимо мяса -> эскимо
                  Азиз! Свет! -> Свет!
e.James
источник
4
Мне интересно, почему у вас нет искусственного ограничения VBA?
EBGreen
3
Я могу легко решить это с VBA, но мне любопытно, если есть решение не VBA. VBA имеет тенденцию к снижению производительности для больших наборов данных.
e.James
Как обычно, два ответа действительно выделяются, и мне трудно решить, какой из них выбрать в качестве правильного ответа. В этом случае Jon и BradC (с помощью Brad) разработали правильные рабочие решения.
e.James
Я выбрал решение BradC, потому что оно кажется более элегантным из двух, и он дает удобное объяснение функции.
e.James
Трудно ответить на ваш вопрос правильно, если вы не укажете, что делает VBA неуместным (поскольку вы можете писать свои собственные макросы и функции в VBA, что делает его эквивалентным встроенным функциям).
dkretz

Ответы:

208

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

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

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

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

LEN(A1)-LEN(SUBSTITUTE(A1," ",""))- Количество пробелов в исходной строке
SUBSTITUTE(A1," ","|", ... )- Заменяет только последний пробел на |
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," ",""))))))
BradC
источник
1
Не могу отблагодарить вас достаточно. Нужна также и остальная часть строки, поэтому простое изменение = RIGHT на = LEFT и удаление LEN (A1) - позволило мне получить остаток. Но спасибо, что проделали всю начальную работу над ногами :)
Люк Даддридж
4
+1: мне нужно запомнить трюк «LEN (A1) -LEN (SUBSTITUTE (A1,« »,«)) »для получения количества экземпляров персонажа
anschauung
2
Отличное решение! Единственная проблема заключается в том, что Excel локализует имена функций, поэтому вам нужно переписать формулу для неанглийского Excel. Вот переписанный вариант для русского: = ПРАВСИМВ (А1; ДЛСТР (А1) -ПОИСК ("|"; ПОДСТАВИТЬ (А1; ""; "|"; ДЛСТР (А1) -ДЛСТР (ПОДСТАВИТЬ (А1; ""; "")))))
Михаил Плискин
Этот ответ разбивается на строки, содержащие последовательные пробелы.
somewhatsapient
1
Я бы порекомендовал разбить формулы на временные столбцы (их можно скрыть позже). Это очень полезно для отладки особых случаев.
Висбуки
84

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

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

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

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

Также замените А1 на ячейку с текстом.

Джерри Бокер
источник
2
Работает у меня - просто заменил первый " "на мой разделитель. 100Кажется, что эти два ограничивают его до 100 символов, если я не ошибаюсь
Benjineer
1
Если мы используем другой разделитель, нам нужно также удалить его в конце, например=TRIM(SUBSTITUTE(RIGHT(SUBSTITUTE(A1, ".", REPT(".", 100)), 100), ".", ""))
Дамблдад
7
Очень умный метод. Он заменяет каждый пробел на 100 пробелов, а затем возвращает последние 100 символов без пробелов в начале и в конце.
Zenadix
@ Benjineer Я думаю, что это работает для строк намного длиннее 100 символов. 100 символов ограничивают размер одного слова. Вы берете правую (или левую) сотню символов ..... если слово длиной 101 символ будет иметь проблемы, но если строка длиной в 100 символов ... с 3 пробелами ... будет дополняется до строки из 400 символов и все еще работает. Джерри Бокер - Очень элегантно, спасибо.
Tin Bum
22

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

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

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

Джо Финкл
источник
2
Это отличная формула. Я изменил формулу, =TRIM(RIGHT(SUBSTITUTE(TRIM(A1), ".", REPT(" ", LEN(TRIM(A1)))), LEN(TRIM(A1))))чтобы получить расширение файла.
Адарш Мадреча
2
Еще один SUBSTITUTEпозволяет ему работать для любого персонажа, а не только пробелы. =TRIM(SUBSTITUTE(RIGHT(SUBSTITUTE(TRIM(A1),"/",REPT("/",LEN(TRIM(A1)))),LEN(TRIM(A1))),"/",""))где "/" - символ-разделитель.
PProteus
@Joefinkle, это действительно краткое и умное решение. Она работает довольно хорошо, просто говоря , что если разделитель является строкой не работает хорошо во всех случаях, здесь приведен пример для разделителей: " ; "(точка с запятой окружена пробелами) с входным значением: "Technology Sprint 24 ; Sprint 4"она возвращает: "; Sprint 4". Я использую решение, дополненное: @PProteus.
Дэвид Лил
Если разделитель является строкой, возможный обходной путь - это заменить его ранее каким-либо специальным символом, например, заменить в формуле @PProteus TRIM(A1)на: TRIM(SUBSTITUTE(A1, "strDelimeter", ";"))во всех местах, чтобы получить новый разделитель символов: ";"или даже лучше использовать char()функцию для поиска какой-то действительно неожиданный персонаж.
Дэвид Лил
1
@PProteus вам не нужна TRIMфункция после добавления второго SUBSTITUTEдля общего случая решения одного символа. Формула обеспечивает ожидаемый результат, исключая эту часть:=SUBSTITUTE(RIGHT(SUBSTITUTE(TRIM(A1),";",REPT(";",LEN(TRIM(A1)))),LEN(TRIM(A1))),";","")
Дэвид Лил
13

Я нашел это в 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)

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

Джон
источник
Ближайшее решение пока нет, но я бы добавил Trim (), так как завершающий пробел сломает его.
EBGreen
Правда, возможно, проще всего подрезать () в промежуточной ячейке, а затем применить приведенную выше формулу к промежуточной ячейке. Кроме того, выплевывает 0, если ячейка оказывается пустой, поэтому также может быть обернута 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)

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

Марк Майн
источник
Работает для меня в Excel 2010. Спасибо
Рудигер Вольф
2

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

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

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

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

{=RIGHT(TRIM(A1),LEN(TRIM(A1))-MAX(IF(MID(TRIM(A1),ROW($1:$999),1)=" ",ROW($1:$999),0)))}
gabrielu
источник
Прохладно. Это действительно интересное использование функций массива! Я не ожидал получить другой ответ после такого долгого времени. Спасибо, что поделились.
e.James
2
=RIGHT(A1,LEN(A1)-FIND("`*`",SUBSTITUTE(A1," ","`*`",LEN(A1)-LEN(SUBSTITUTE(A1," ",""))))) 
Коди Грей
источник
Вы проверяли это? Не работает для меня с "Вы классифицированы как человек?"
Эд Гиннес
Нет, это не работает. Хотя есть некоторые интересные элементы. LEN (A1) -LEN (ЗАМЕНА (A1, "", "") дает вам количество пробелов в строке.
BradC
Это интересная функция. Жаль, что это не работает. Мне нравится хитрость в том, что я могу посчитать количество пробелов.
e.James
@Brad: я отредактировал твой пост, чтобы показать * символы. Оригинал не распечатал их должным образом. С этим на месте, это работает. +1
e.James
2

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

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

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

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

Андрей Б
источник
1

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

"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и FINDING первого пробела. Однако для последнего (!) Слова RIGHTфункция является неправильным выбором, когда вы пытаетесь это сделать, потому что, к сожалению, в FIND нет флага для направления, в котором вы хотите проанализировать вашу строку.

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

Ralf
источник
Это намного проще, чем все остальные варианты, большое спасибо !! Почему поиск не может иметь обратную находку или замену - я помню , что - то делать с помощью отрицательного числа , чтобы сделать обратный поиск, но явно не УВА ....
Craig Lambie
3
ОП попросил не VBA.
Трипп Кинетикс
Также это безумие! Если вы собираетесь использовать VBA, вы можете легко найти обратный результат
Дензил Ньюман,
1
=LEFT(A1,FIND(IF(
 ISERROR(
  FIND("_",A1)
 ),A1,RIGHT(A1,
  LEN(A1)-FIND("~",
   SUBSTITUTE(A1,"_","~",
    LEN(A1)-LEN(SUBSTITUTE(A1,"_",""))
   )
  )
 )
),A1,1)-2)
JB
источник
1

Скопируйте в столбец, выберите этот столбец и HOME> Редактирование> Найти и выбрать, Заменить:

Найти то, что:

Replace All,

После звездочки есть пробел.

pnuts
источник
Обратите внимание, что * - (жадный) подстановочный знак в поисках Excel, поэтому он сопоставляет все до последнего пробела и заменяет его ничем
Superfly Jon
0

Я перевел на PT-BR, так как мне это тоже нужно.

(Обратите внимание, что я изменил пространство на, \потому что мне нужно было имя файла только из строк пути.)

=SE(ÉERRO(PROCURAR("\",A1)),A1,DIREITA(A1,NÚM.CARACT(A1)-PROCURAR("|", SUBSTITUIR(A1,"\","|",NÚM.CARACT(A1)-NÚM.CARACT(SUBSTITUIR(A1,"\",""))))))
Marcelo
источник
3
Я не знаю, как читать Excel по-португальски, поэтому я должен
поверить на
0

Другой способ добиться этого, как показано ниже

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

введите описание изображения здесь

Картик Гунасекаран
источник
-1

У меня также была такая задача, и когда я закончил, используя вышеуказанный метод, у меня возник новый метод: почему бы вам не сделать это:

  1. Переверните строку («string one» становится «eno gnirts»).
  2. Используйте старый добрый Find (который жестко запрограммирован слева направо).
  3. Переверните его в читаемую строку снова.

Как это звучит?

Tod Heartsound
источник
12
Конечно. Но как перевернуть строку в Excel?
e.James