Excel вытащить значение в скобках

Как формулой Excel вытащить текст в скобках

Далее будет приведена формула, позволяющая извлечь текст находящийся в круглых скобках, но в начале хотелось бы подчеркнуть, что Вы находитесь на сайте, основное назначение которого помощь в изучении Excel как «с нуля» так и продвинутый уровень. Обучение, советы, разъяснения формул и всего, что связано с Excel проводиться дистанционно по Skype.

 Скорее всего, если Вы активно обрабатываете данные в Excel, а особенно разные списки, то у Вас возникала необходимость вытащить (извлечь) текст находящийся в скобках. Причем текстовых строк (ячеек) много, а текст в скобках находится иногда в начале, иногда в средине, а бывает, что вообще, в конце ячейки.

Применив формулу с этой страницы, Вы избавитесь от ручного труда и Вам не придется копировать и вставлять каждый фрагмент по отдельности. Формула реально сэкономит Вам массу сил и времени.

С помощью этой формулы можно извлечь текст (любую последовательность символов), находящийся между открывающейся и закрывающейся скобками.

 Формула позволяющая извлечь текст из скобок

=ПСТР(B2;1+ПОИСК(«(«;B2);ПОИСК(«)»;B2)-ПОИСК(«(«;B2)-1)

Комментарии:

— «обрабатываемый» текст должен находиться в определенной ячейке (в примере это яч. B2)

— если в ячейке B2 не будет открывающей и закрывающей скобки, то формула вернет значение ошибки #ЗНАЧ!

— если в яч. B2 будет больше одной открывающей и/или закрывающей скобки, то формула вытащит все то, что находится между первой (слева-направо) открывающей скобкой и первой закрывающей скобкой

Пример текста (это афоризм, а в скобках указан автор)

Чтобы победить, надо ожидать, что победишь. (Ричард Бах)

и результат (формула извлекла текст из скобок)

Ричард Бах

 Несмотря на то, что эта формула очень полезная и востребованная, но она может не учитывать ряд специфических нюансов. Например, может потребоваться достать из скобок не только текст, который находится между первой парой скобок, но и текст, находящийся во второй паре скобок или же Вам, наоборот, необходимо оставить только то, что не в скобках..

 Все решения со всеми нюансами по объективным причинам выложить невозможно. Остались вопросы или формула не делает то, что Вам нужно? Оставьте сообщение в нижней части страницы, или обратитесь за помощью по программе Excel.

 ExcelSkype.Ru – единственный сайт в русскоязычном Internet специализирующийся на дистанционном консультировании и обучении Excel. Помощь или обучение производится через Skype. Все контакты ТУТ

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

Как в Excel извлечь текст между круглыми скобками

Основная формула

=ПСТР(текст;ПОИСК(«(«;текст)+1;ПОИСК(«)»;текст)-ПОИСК(«(«;текст)-1)

Описание

Для выделения текста между скобками, фигурными скобками, скобками и т.д. Можно использовать формулу, основанную на функции ПСТР, с помощью функции ПОИСК. В показанном примере формула C5 имеет следующий вид:

=ПСТР(B5;ПОИСК(«(«;B5)+1;ПОИСК(«)»;B5)-ПОИСК(«(«;B5)-1)+0

Пояснение

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

Это находит левые круглые скобки и добавляет 1, чтобы получить позицию первого символа внутри круглых скобок. Чтобы выяснить, сколько символов нужно извлечь, мы используем это выражение:

ПОИСК(«)»;B5)-ПОИСК(«(«;B5)-1

Это определяет местонахождение вторых скобок в тексте и вычитает позицию первых скобок (без единицы), чтобы получить общее количество символов, которые необходимо извлечь. Используя эту информацию, ПСТР извлекает только текст внутри круглых скобок.
Наконец, поскольку в этом конкретном примере мы хотим получить число в качестве окончательного результата, мы добавляем ноль к текстовому значению, возвращаемому ПСТР:

Эта математическая операция заставляет Excel преобразовывать текстовые значения в числа. Если вам не нужно число в конце, этот шаг не требуется.

Пытаюсь вставить две формулы в одну, чтобы извлечь из текста цифры заключенные в скобки.

Эта формула извлекает цифры после скобки и далее лишнее.
=ПСТР(A4;ПОИСК(«(«;A4;1)+1;50)

Эта дополнительная формула убирает лишнее, но как эти формулы объединить в одну?
=ПОДСТАВИТЬ(C4;»)»;»»;1)*1

См файл.


=--ПСТР(A3;ПОИСК("(";A3)+1;ПОИСК(")";A3)-ПОИСК("(";A3)-1)


=-ПСТР(ЛЕВБ(A3;ПОИСК(")";A3));ПОИСК("(";A3);9)



Спасибо, помогающим!
Мне тоже удалось самостоятельно создать формулу, недостаток она больше ваших по длине.
=ПОДСТАВИТЬ(ПСТР(A3;ПОИСК(«(«;A3;1)+1;50);ПСТР(A3;ПОИСК(«)»;A3;1);50);»»)*1


Уважаемый gling, пожалуйста проверьте свою формулу ещё раз.


А что её проверять, в ней что то не так? Вопрос был

Цитироватькак эти формулы объединить в одну?

, на него и отвечал. А правильные формулы вам предложили и без меня., Могу прописать почти то же самое

=ПСТР(ЛЕВСИМВ(A3;ПОИСК(")";A3)-1);ПОИСК("(";A3)+1;9) При том в файле вы просите

ЦитироватьИзвлекаться должны только цифры в скобках

не числа, значит и преобразовывать в числовой формат их не обязательно было. Если нужно было извлечь число из скобок, тогда не надо было писать про две формулы в одну и не цифры, а числа извлекать. Молодцы помогающие, они обладают даром экстрасенсов и прочитали ваши мысли, а я вот не угадал. Ничего в следующий раз и у меня получится.)))


Хорошо, конечно уметь писать формулы с функциями!!! А попроще не пробовали — 2 раза текст по столбцам — разделитель — сначала (, а потом ), а что не нужно — пропустить.


Проще, так проще, Наташа ;)
ctrl+h — меняем на пусто «*(«, потом «)*». Сразу получаем цифры в столбце.

Я, как всегда, чертовски адекватен… Email: kuklp60@gmail.com WM Z206653985942, R334086032478, U238399322728, E332314026771



ПСТР() и ПОИСК () Извлечь текст между скобками

=ПСТР(Текст; Поиск_первой_позиции(«(«:Текст)+1,Поиск_второй _позиции(«)»;Тектс)-Поиск_первой_позиции(«(«;Тектс)-1)

Чтобы извлечь текст между скобками, вы можете использовать формулу, основанную на функции ПСТР () и  функции ПОИСК ().

В показанном примере, формула в E7:

=ПСТР(D7;ПОИСК(«(«;D7)+1;ПОИСК(«)»;D7)-ПОИСК(«(«;D7)-1)

Основой этой формулы является функция ПСТР () , которая извлекает определенное количество символов из текста, начиная с определенного места.

Найти «Поиск_первой_позиции»  с какой позиции начинать извлечение текста, мы используем это выражение:

ПОИСК(«(«;D7)+1

Начало позиции:  14+1=15

Функция ПОИСК () находит позицию скобку в тексте, а затем уберем саму скобку с первой позиции прибавив единицу.

Для нахождения «Поиск_второй _позиции» второй скобки, мы используем это выражение:

ПОИСК(«)»;D7)-1

Начало второй позиции: 18-1=17

Функция ПОИСК () находит позицию скобки в тексте, а затем уберем саму скобку с последней позиции отняв единицу.

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

ПОИСК(«)»;D7)-ПОИСК(«(«;D7)-1)

Вторая позиция, отнять первую, получим количество символов для извлечения

17 — 14 =3      2,4

И соберем всю формулу как в ячейке E7:

=ПСТР(D7;ПОИСК(«(«;D7)+1;ПОИСК(«)»;D7)-1-ПОИСК(«(«;D7))

=ПСТР(Текст; позиция первая скобка; позиция Вторая скобка)

=ПСТР(Текст;14+1;17-1-14)

Можно прибавить ноль в конце и получить в место текстового значения цифровое.

=ПСТР(D7;ПОИСК(«(«;D7)+1;ПОИСК(«)»;D7)-1-ПОИСК(«(«;D7))+0

 

Mikhail76

Пользователь

Сообщений: 76
Регистрация: 10.11.2017

Добрый день.
Подскажите как из ячейки B1 извлечь номера в скобках, если их не один в одной ячейки.
В идеале номера должны быть в столбце А по одному в ячейке.

 

Msi2102

Пользователь

Сообщений: 3134
Регистрация: 31.03.2014

Mikhail76, Покажите в примере как должно получиться

 

Mikhail76

Пользователь

Сообщений: 76
Регистрация: 10.11.2017

#3

16.06.2022 14:07:59

Цитата
написал:
Mikhail76, Покажите в примере как должно получиться

Во вложении.
Дело в том, что в разных ячейках может быть разное кол-во ТМЦ.

Прикрепленные файлы

  • Пример.xlsx (9.66 КБ)

 

surkenny

Пользователь

Сообщений: 2365
Регистрация: 13.06.2014

#4

16.06.2022 14:18:31

В PQ:

Код
let
  text      = Table.FirstValue ( Excel.CurrentWorkbook(){[ Name = "nomenclature" ]}[Content] ),
  split     = Text.SplitAny ( text, "()" ),
  alternate = List.Alternate ( split, 1, 1 ),
  select    = List.Select ( alternate, ( x ) => Text.Length ( x ) = 10 ),
  toTable   = Table.FromColumns ( { select }, type table [ #"СК-МТР" = text ] )
in
  toTable

Прикрепленные файлы

  • Пример — 2022-06-16T141136.435.xlsx (17.64 КБ)

 

memo

Пользователь

Сообщений: 1422
Регистрация: 28.02.2018

Excel 2013/2016

#5

16.06.2022 14:22:10

Вариант формулой. (Нужен офис не ниже 2013)

Код
=FILTERXML("<A><B>"&SUBSTITUTE(SUBSTITUTE(SUBSTITUTE($B$2;"(";" ");")";" ");" ";"</B><B>")&",</B></A>";"//B[.*0=0][string-length()=10]["&ROW(A1)&"]")

Прикрепленные файлы

  • Пример.xlsx (10.6 КБ)

 

Mikhail76

Пользователь

Сообщений: 76
Регистрация: 10.11.2017

#6

16.06.2022 14:47:20

Цитата
написал:
Вариант формулой. (Нужен офис не ниже 2013)

Код
    [URL=#]?[/URL]       1      =FILTERXML(  "<A><B>"  &SUBSTITUTE(SUBSTITUTE(SUBSTITUTE($B$2;  "("  ;  " "  );  ")"  ;  " "  );  " "  ;  "</B><B>"  )&  ",</B></A>"  ;  "//B[.*0=0][string-length()=10]["  &ROW(A1)&  "]"  )   

 

Добрый день. В исходнике нужно перенести данные из ячейки М1279 в L1279. Как будет выглядеть формула? Впервые с такой сталкиваюсь.

 

Jack Famous

Пользователь

Сообщений: 10846
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

Mikhail76, макрос подойдёт?

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

Msi2102

Пользователь

Сообщений: 3134
Регистрация: 31.03.2014

#8

16.06.2022 15:27:40

Если офис 2019 и выше:

Код
=ФИЛЬТР(ПСТР(B2;СТРОКА($1:$999);12);ЕСЛИ(--(ЛЕВСИМВ(ПСТР(B2;СТРОКА($1:$999);12);1)="(")+--(ПРАВСИМВ(ПСТР(B2;СТРОКА($1:$999);12);1)=")")=2;1;0))

Прикрепленные файлы

  • Пример (13).xlsx (11.41 КБ)

Изменено: Msi210216.06.2022 15:42:20

 

Jack Famous

Пользователь

Сообщений: 10846
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

#9

16.06.2022 16:43:51

Пусть будет. Скрин, Файл и Код

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

Mikhail76

Пользователь

Сообщений: 76
Регистрация: 10.11.2017

 

Msi2102

Пользователь

Сообщений: 3134
Регистрация: 31.03.2014

#11

16.06.2022 18:13:29

Цитата
Jack Famous написал:
Пусть будет. Скрин, Файл и Код

Тогда ещё вариант. Вводится как массивная

Код
Function GetCode_2(ByVal v, Optional m& = 0, Optional s& = 0) 'As String
Dim r&
Set Dict = CreateObject("System.Collections.ArrayList")
If Not v Like "*(*)*" Then Exit Function
arr1 = Split(v, "(")
For n = LBound(arr1) + 1 To UBound(arr1)
    r = InStr(arr1(n), ")")
    If Not r <= 1 Then
        If r - 1 = m Or m = 0 Then
            If s = 0 Then
                Dict.Add CStr(Split(arr1(n), ")")(0))
            Else
                If Not Dict.contains(CStr(Split(arr1(n), ")")(0))) Then Dict.Add CStr(Split(arr1(n), ")")(0))
            End If
        End If
    End If
Next
GetCode_2 = WorksheetFunction.Transpose(Dict.ToArray)

End Function

PS: хотя уже море вариантов на регулярках есть  :D

Прикрепленные файлы

  • Скобки.xlsb (16.32 КБ)

 

Jack Famous

Пользователь

Сообщений: 10846
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

Msi2102, строковые быстрее регулярок в этом случае, если что  :)
В

моей теме

Андрей VG как раз сравнивал скорости (и функция на строковых — его)

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

Msi2102

Пользователь

Сообщений: 3134
Регистрация: 31.03.2014

#13

17.06.2022 10:22:55

Цитата
Jack Famous написал:
как раз сравнивал скорости

Я не про скорость, просто есть куча готовых и в принципе более универсальных вариантов, нужно было только поискать  :)
Добавил поиск по всему выделенному диапазону

Код
Function GetCode_2(ByVal v, Optional m& = 0, Optional s& = 0) 'As String
Dim r As Integer, n As Integer, rn As Range
Set Dict = CreateObject("System.Collections.ArrayList")
For Each rn In v
    If rn Like "*(*)*" Then 'Exit Function
        arr1 = Split(rn, "(")
        For n = LBound(arr1) + 1 To UBound(arr1)
            r = InStr(arr1(n), ")")
            If Not r <= 1 Then
                If r - 1 = m Or m = 0 Then
                    If s = 0 Then
                        Dict.Add CStr(Split(arr1(n), ")")(0))
                    Else
                        If Not Dict.contains(CStr(Split(arr1(n), ")")(0))) Then Dict.Add CStr(Split(arr1(n), ")")(0))
                    End If
                End If
            End If
        Next
    End If
Next
GetCode_2 = WorksheetFunction.Transpose(Dict.ToArray)
End Function

Прикрепленные файлы

  • Скобки.xlsb (16.8 КБ)

 

Jack Famous

Пользователь

Сообщений: 10846
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

#14

17.06.2022 10:51:31

Цитата
Msi2102: есть куча готовых и в принципе более универсальных вариантов

я не могу в качестве кода использовать то, принцип работы чего я не понимаю (и при это могу сделать понятный мне аналог). Надо сидеть и разбираться, что там имел ввиду автор и зачем.

Msi2102, вот вы, например, почему System.Collections.ArrayList вместо словарей и вообще зачем он тут ведь задача отбора уникальных не стояла?…  :)  Вот берёшь такое «готовое» решение, а потом думаешь, а почему оно работает не так, как ты хотел…

У меня же принцип простой: ищем первый разделитель, после него ищем второй. Если какой-то из низ не найден, то выходим. Если оба найдены, то берём всё, что между ними и повторяем. ТС не указал нюанс, что ему на самом деле не ВСЁ, что между скобок нужно, а только коды по понятной маске. Добавил в функцию возможность отфильтровать по маске.

Или как в соседней теме:

готовое решение от ноунейма, который просто ошибся  :D  и вместо кириллической «р» (эр) латинскую «p» (пи) написал. А потом очень долго можно сидеть и думать, почему не сходится…

Изменено: Jack Famous17.06.2022 10:57:10

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

Msi2102

Пользователь

Сообщений: 3134
Регистрация: 31.03.2014

#15

17.06.2022 11:24:23

Цитата
Jack Famous написал:
я не могу в качестве кода использовать то, принцип работы чего я не понимаю

Вы наверное неправильно поняли фразу в моем сообщении.

Цитата
Msi2102 написал:
нужно было только поискать

Я имел ввиду, что сам автор мог получше поискать  :)

Цитата
Jack Famous написал:
Msi2102 , вот вы, например, почему System.Collections.ArrayList вместо словарей и вообще зачем он тут ведь задача отбора уникальных не стояла?…

Вначале я написал на Scripting.Dictionary (кстати он быстрее), но на работе была тошниловка и решил добавить немного плюшек  :D . К тому же поиска по маске тоже не требовалось и тем не менее Вы её добавили.

Цитата
Jack Famous написал:
Вот берёшь такое «готовое» решение, а потом думаешь, а почему оно работает не так, как ты хотел…

А что там может не так работать?
Принцип тут такой же как и у Вас

Цитата
Jack Famous написал:
У меня же принцип простой: ищем первый разделитель, после него ищем второй.
 

Jack Famous

Пользователь

Сообщений: 10846
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

#16

17.06.2022 11:37:44

Цитата
Msi2102: поиска по маске тоже не требовалось и тем не менее Вы её добавили

в примере ТС показал желаемый результат и это не ВСЕ значения из скобок, а только коды. У меня реализованы оба варианта — так универсальнее, в зависимости от потребности.

Цитата
Msi2102: А что там может не так работать?

например, оно отбирает уникальные, а об этом ничего сказано не было. Тем более, что у вас это не опция (как у меня с маской), а единственный вариант работы функции.

Цитата
Msi2102: Принцип тут такой же как и у Вас

как минимум, из-за отбора уникальных, это уже не так. К тому же, при вложенных скобках, наши варианты могут повести себя по-разному (не тестил, но так кажется)

Цитата
Msi2102: решил добавить немного плюшек

плюшка в виде заведомо более медленного и не менее сложного [чем словари] варианта :)

P.S.: If Not r <= 1 Then вместо If r или If r<>0 — тоже «для разнообразия»?))

Изменено: Jack Famous17.06.2022 11:38:21

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

Msi2102

Пользователь

Сообщений: 3134
Регистрация: 31.03.2014

#17

17.06.2022 13:11:13

Цитата
Jack Famous написал:
Тем более, что у вас это не опция

Почему, напишите так

Код
=GetCode_2(B1:B3)

и он выдаст все варианты

Цитата
Jack Famous написал:
If Not r  0 — тоже «для разнообразия»?))

Нет, просто удаляю вариант если Внутри скобок пустота «()», если Ваш вариант, то при наличии () будут пустые ячейки

Цитата
Jack Famous написал:
плюшка в виде заведомо более медленного

Оно конечно медленнее, но на сколько, сущие пустяки  :D  К тому же у Вас тоже есть ReDim Preserve ещё нужно посмотреть, что будет быстрее :D
PS: В принципе скопировал на 1000 строк, результат моментальный, без задержек, общее количество найденных около 11000. Поэтому мне кажется, что у Вас просто предвзятое отношение к System.Collections.ArrayList

Изменено: Msi210217.06.2022 14:28:31

Like this post? Please share to your friends:
  • Excel выстраивая список сам
  • Excel выстраивает по убыванию
  • Excel высота ячейки по размеру текста
  • Excel высота ячейки по значению
  • Excel высота ячейки данные