2008-12-08 7 views
133

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

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

Примеры:

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

Мне интересно, почему у вас нет искусственного ограничения VBA? – EBGreen 2008-12-08 17:41:18

+2

Я могу легко решить это с помощью VBA, но мне любопытно, есть ли решение, отличное от VBA. VBA имеет тенденцию к штрафам за производительность для больших наборов данных. – 2008-12-08 18:20:00

+0

Как обычно, два ответа действительно выделяются, и мне сложно определить, какой из них выбрать как правильный ответ. В этом случае и Jon, и BradC (с помощью Brad) разработали правильные рабочие решения. – 2008-12-08 18:34:31

ответ

181

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

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

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

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

LEN(A1)-LEN(SUBSTITUTE(A1," ","")) – графа пространств в исходной строке
SUBSTITUTE(A1," ","|", ...) – заменяет только окончательное пространство с |
FIND("|", ...) – находит абсолютное положение, которое было заменено | (это было окончательное пространство)
Right(A1,LEN(A1) - ...)) – Возвращает все cha racters после этого |

EDIT: для учета случая, когда исходный текст не содержит пробелы, добавьте следующие строки в начале следующей формуле:

=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," ","")))))) 
2
=RIGHT(A1,LEN(A1)-FIND("`*`",SUBSTITUTE(A1," ","`*`",LEN(A1)-LEN(SUBSTITUTE(A1," ",""))))) 
+0

Вы проверили это? Не работает для меня с «Вы классифицированы как люди?» – 2008-12-08 17:55:10

+0

Нет, это не сработает. Есть некоторые интересные элементы. LEN (A1) -LEN (SUBTITUTE (A1, "", "") дает вам количество пробелов в строке. – BradC 2008-12-08 18:04:42

+0

Это интересная функция. Слишком плохо, что она не работает. Мне нравится трюк за возможность чтобы подсчитать количество пробелов. – 2008-12-08 18:24:41

12

Я нашел this на 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 также не работает с конечными пробелами или пустым ячеек ...
[2nd edit] на самом деле, она не работает для отдельных слов либо ...

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

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

{=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)))} 
3

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

"My little cat" (1) 

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

"tac elttil yM" (2) 

С =LEFT(A1;FIND(" ";A1)-1) А2 вы получаете "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" в А2.

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

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

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

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

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

62

Это метод я использовал с большим успехом:

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

Чтобы получить первое слово в строке, просто изменить справа налево

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

Кроме того, замените A1 на ячейка, содержащая текст.

0

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

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

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

16

Более надежный вариант ответа Джерри:

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

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

2

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

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

С «Моей маленькой кошкой» в A1 привел бы к «Моему маленькому '(где Джо и Джерри даст „кот“

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

1
=LEFT(A1,FIND(IF(
ISERROR(
    FIND("_",A1) 
),A1,RIGHT(A1, 
    LEN(A1)-FIND("~", 
    SUBSTITUTE(A1,"_","~", 
    LEN(A1)-LEN(SUBSTITUTE(A1,"_","")) 
    ) 
) 
) 
),A1,1)-2) 
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))))) 

enter image description here

0

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

Find what:

Заменить все.

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