Як я можу здійснити пошук зворотного рядка в Excel без використання VBA?


165

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

Використовуючи вбудовані функції Excel (немає VBA), чи є спосіб виділити останнє слово в кожній рядку?

Приклади:

  Ви класифікуєтесь як людину? -> людська?
Негативно, я м'ясо ескімо -> ескімо
                  Азіз! Світло! -> Світло!

4
Мені цікаво, чому у вас немає штучного обмеження VBA?
EBGreen

3
Я легко вирішую це за допомогою VBA, але мені цікаво, чи є рішення, що не VBA. VBA, як правило, вимагає штрафних санкцій за великі набори даних.
e.James

Як завжди, два відповіді дійсно виділяються, і я важко вирішую, яку вибрати як правильну відповідь. У цьому випадку і Джон, і БредК (за допомогою Бреда) придумали правильні, робочі рішення.
e.James

Я вибрав рішення БредК, оскільки воно, здається, є більш елегантним з двох, і він надає зручне пояснення функції.
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," ","|", ... )- Замінює лише остаточний пробіл на a |
FIND("|", ... )- Знаходить абсолютне положення заміненого |(це було остаточне пробіл)
Right(A1,LEN(A1) - ... ))- Повертає всі символи після цього|

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

1
Не можу подякувати вам достатньо. Потрібна була й решта рядка, тому проста зміна = ВПРАВО на = ВЛЕВО та видалення LEN (A1) - дозволило мені отримати решту. Але дякую, що ви
виконали

4
+1: мені доведеться запам'ятати трюк "LEN (A1) -LEN (SUBSTITUTE (A1," "," ")) для отримання кількості екземплярів символу
anschauung

2
Відмінне рішення! Єдина проблема полягає в тому, що Excel локалізує назви функцій, тому вам потрібно переписати формулу для не-англійського Excel. Ось переписаний варіант для російського: = ПРАВСИМВ (A1; ДЛСТР (A1) -ПОИСК ("|"; ПОДСТАВИТЬ (A1; ""; "|"; ДЛСТР (A1) -ДЛСТР (ПОДСТАВИТЬ (A1; ""; "")))))
Михайло Пліскін

Ця відповідь розбивається на рядки, що містять послідовні пробіли.
дещоспільний

1
Я рекомендую розбивати формули на тимчасові стовпці (їх можна приховати пізніше). Це дуже корисно для налагодження особливих випадків.
Вісбукі

84

Це техніка, яку я з великим успіхом використовував:

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

Щоб отримати перше слово в рядку, просто перейдіть з Правого на ЛІВО

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

Також замініть А1 на клітинку, що містить текст.


2
Працює для мене - просто замінив перший " "своїм роздільником. Два 100s , здається, обмежити його в рядок 100 символів , якщо я не помиляюся
Benjineer

1
Якщо ми використовуємо інший роздільник, нам потрібно зняти це також наприкінці, наприклад=TRIM(SUBSTITUTE(RIGHT(SUBSTITUTE(A1, ".", REPT(".", 100)), 100), ".", ""))
dumbledad

7
Дуже розумний метод. Що потрібно зробити, це замінити кожен пробіл на 100 пробілів, а потім повернути останні 100 символів без пробілів / пробілів.
Зенадікс

@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))),"/","")), де "/" є обмежувальним символом.
ППротей

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

[редагувати] У мене недостатньо респондентів для коментарів, тому це здається найкращим місцем ... Відповідь Бредка також не працює з пробілами чи порожніми клітинками ...
[2-я редакція] насправді, вона не працює для окремі слова або ...


Найближче рішення поки що, але я б кинув в обрізку (), оскільки пробіл, що проривається, порушить його.
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) для роздільника, а не вертикального рядка "|" про всяк випадок, якщо це потрібний текст.


Працює для мене у відмінні 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)))}

Класно. Це дійсно цікаве використання функцій масиву! Я не сподівався отримати ще одну відповідь через такий довгий час. Дякую, що поділились.
e.James

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

Ви тестували це? Це не працює для мене з "Ви класифікуєтесь як людину?"
Ед Гінес

Ні, це не працює. Однак є кілька цікавих елементів. LEN (A1) -LEN (SUBSTITUTE (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))))

З "Мій маленький котик" в A1 в результаті вийде "Моя маленька" (де Джо і Джеррі дадуть "кота"

Точно так само, як Джеррі і Джо виділяють останнє слово, це потім просто отримує все ліворуч від цього (потім обрізає його назад)


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твердження у формулі робить цю роботу.


Це набагато простіше, ніж усі інші варіанти тут, велике спасибі !! Чому Find не може мати зворотну знахідку чи заміну - я, здається, пам’ятаю щось, що стосується використання негативного числа для зворотного пошуку, але явно не vba ....
Крейг Ламбі

3
ОП просили не VBA.
Tripp Kinetics

Теж божевільне! Якщо ви збираєтесь використовувати 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)

1

Скопіюйте у стовпець, виберіть цей стовпець та ДОМАШНЯ> Редагування> Знайти та вибрати, замінити:

Знайти що:

Replace All.

Після зірочки є пробіл.


Зауважте, що * - це (жадібна) підказка у програмах 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,"\",""))))))

3
Я не знаю, як читати Excel португальською мовою, тому мені доведеться прийняти ваше слово :)
e.James

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. Зворотний рядок ("рядок один" стає "eno gnirts").
  2. Використовуйте старий добрий Знахід (який жорстко кодується зліва направо).
  3. Знову поверніть його в читабельний рядок.

Як це звучить?


12
Звичайно. Але як повернути рядок у Excel?
e.James
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.