Страницы: 1
RSS
Извлечь данные в скобках из ячейки
 
Добрый день.
Подскажите как из ячейки B1 извлечь номера в скобках, если их не один в одной ячейки.
В идеале номера должны быть в столбце А по одному в ячейке.
 
Mikhail76, Покажите в примере как должно получиться
 
Цитата
написал:
Mikhail76, Покажите в примере как должно получиться
Во вложении.
Дело в том, что в разных ячейках может быть разное кол-во ТМЦ.
 
В 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
 
Вариант формулой. (Нужен офис не ниже 2013)
Код
=FILTERXML("<A><B>"&SUBSTITUTE(SUBSTITUTE(SUBSTITUTE($B$2;"(";" ");")";" ");" ";"</B><B>")&",</B></A>";"//B[.*0=0][string-length()=10]["&ROW(A1)&"]")
 
Цитата
написал:
Вариант формулой. (Нужен офис не ниже 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. Как будет выглядеть формула? Впервые с такой сталкиваюсь.
 
Mikhail76, макрос подойдёт?
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Если офис 2019 и выше:
Код
=ФИЛЬТР(ПСТР(B2;СТРОКА($1:$999);12);ЕСЛИ(--(ЛЕВСИМВ(ПСТР(B2;СТРОКА($1:$999);12);1)="(")+--(ПРАВСИМВ(ПСТР(B2;СТРОКА($1:$999);12);1)=")")=2;1;0))
Изменено: Msi2102 - 16.06.2022 15:42:20
 
Пусть будет. Скрин, Файл и Код
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Коллеги, спасибо!
 
Цитата
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
 
Msi2102, строковые быстрее регулярок в этом случае, если что  :)
В моей теме Андрей VG как раз сравнивал скорости (и функция на строковых - его)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
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
 
Цитата
Msi2102: есть куча готовых и в принципе более универсальных вариантов
я не могу в качестве кода использовать то, принцип работы чего я не понимаю (и при это могу сделать понятный мне аналог). Надо сидеть и разбираться, что там имел ввиду автор и зачем.

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

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

Или как в соседней теме: готовое решение от ноунейма, который просто ошибся  :D  и вместо кириллической "р" (эр) латинскую "p" (пи) написал. А потом очень долго можно сидеть и думать, почему не сходится…
Изменено: Jack Famous - 17.06.2022 10:57:10
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
я не могу в качестве кода использовать то, принцип работы чего я не понимаю
Вы наверное неправильно поняли фразу в моем сообщении.
Цитата
Msi2102 написал:
нужно было только поискать
Я имел ввиду, что сам автор мог получше поискать  :)
Цитата
Jack Famous написал:
Msi2102 , вот вы, например, почему System.Collections.ArrayList вместо словарей и вообще зачем он тут ведь задача отбора уникальных не стояла?…
Вначале я написал на Scripting.Dictionary (кстати он быстрее), но на работе была тошниловка и решил добавить немного плюшек  :D . К тому же поиска по маске тоже не требовалось и тем не менее Вы её добавили.
Цитата
Jack Famous написал:
Вот берёшь такое "готовое" решение, а потом думаешь, а почему оно работает не так, как ты хотел…
А что там может не так работать?
Принцип тут такой же как и у Вас
Цитата
Jack Famous написал:
У меня же принцип простой: ищем первый разделитель, после него ищем второй.
 
Цитата
Msi2102: поиска по маске тоже не требовалось и тем не менее Вы её добавили
в примере ТС показал желаемый результат и это не ВСЕ значения из скобок, а только коды. У меня реализованы оба варианта - так универсальнее, в зависимости от потребности.
Цитата
Msi2102: А что там может не так работать?
например, оно отбирает уникальные, а об этом ничего сказано не было. Тем более, что у вас это не опция (как у меня с маской), а единственный вариант работы функции.
Цитата
Msi2102: Принцип тут такой же как и у Вас
как минимум, из-за отбора уникальных, это уже не так. К тому же, при вложенных скобках, наши варианты могут повести себя по-разному (не тестил, но так кажется)

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

P.S.: If Not r <= 1 Then вместо If r или If r<>0 — тоже "для разнообразия"?))
Изменено: Jack Famous - 17.06.2022 11:38:21
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
Тем более, что у вас это не опция
Почему, напишите так
Код
=GetCode_2(B1:B3)

и он выдаст все варианты
Цитата
Jack Famous написал:
If Not r  0 — тоже "для разнообразия"?))
Нет, просто удаляю вариант если Внутри скобок пустота "()", если Ваш вариант, то при наличии () будут пустые ячейки
Цитата
Jack Famous написал:
плюшка в виде заведомо более медленного
Оно конечно медленнее, но на сколько, сущие пустяки  :D  К тому же у Вас тоже есть ReDim Preserve ещё нужно посмотреть, что будет быстрее :D
PS: В принципе скопировал на 1000 строк, результат моментальный, без задержек, общее количество найденных около 11000. Поэтому мне кажется, что у Вас просто предвзятое отношение к System.Collections.ArrayList
Изменено: Msi2102 - 17.06.2022 14:28:31
Страницы: 1
Наверх