Страницы: 1
RSS
Поиск фрагмента текста по маске
 
Добрый день!
Есть длинный фрагмент текста типа CE.U1.RPR.0120.10UJA.0.AR.LC0017-ST02
Нужно чтобы формула находила фрагмент "10UJA" конкретно в этом примере.
Но не все так просто.
Возможны варианты, где искомое будет изменяться (не будет только "10UJA").
Искомое значение это текст вида "xxUyy", где:
-xx - число от 10 до 29 (например 10UJA, 15UJA, 29UJA);
-U - символ "U" в английской раскладке (10UJA);
-yy - любые две буквы английского алфавита  (например 10URS, 15UJA, 29UVF)
Искомому фрагменту всегда предшествует символ "точка".
 
Цитата
Сергей М. написал:
Искомому фрагменту всегда предшествует символ "точка".
а как же строка 12?
Код
Function извл(t$)
    With CreateObject("VBScript.RegExp")
        .Pattern = "\d{2}U[A-Z]{2}"
         извл = .Execute(t)(0)
    End With
End Function
Изменено: buchlotnik - 01.12.2020 07:43:09
Соблюдение правил форума не освобождает от модераторского произвола
 
Или так
Код
Public Function REGREGREG(myText As String, Optional myPattern As String, Optional Razdel As String) As String

Set objRegExp = CreateObject("VBScript.RegExp")
If myPattern = "" Then objRegExp.Pattern = "\d{2}U[A-Z]{2}" Else objRegExp.Pattern = myPattern
If Razdel = "" Then Razdel = "; "

objRegExp.Global = True
myStr = myText
Set objMatches = objRegExp.Execute(myStr)
For i = 0 To objMatches.Count - 1
    Set objMatch = objMatches.Item(i)
    If i = 0 Then REGREGREG = objMatch.Value Else REGREGREG = REGREGREG & Razdel & objMatch.Value
Next

End Function
 
Массивно и в лоб
=MID(A1;MIN(IF(IFERROR((MID(A1;ROW($1:$99);1)=".")*(MID(A1;ROW($1:$99)+3;1)="u")*(ABS(MID(A1;ROW($1:$99)+1;2)-19,5)<=9,5)*(ABS(CODE(UPPER(MID(A1;ROW($1:$99)+4;1)))-77,5)<=12,5)*(ABS(CODE(UPPER(MID(A1;ROW($1:$99)+5;1)))-77,5)<=12,5);1=0);ROW($1:$99)))+1;5)

Если полбу
=MID(A1;MIN(IF((MMULT(--(MID(A1;ROW($1:$99)+{0\3};1)={".""u"});{1;1})=2)*IFERROR((ABS(MID(A1;ROW($1:$99)+1;2)-19,5)<=9,5);)*(MMULT(--(IFERROR(ABS(CODE(UPPER(MID(A1;ROW($1:$99)+{4\5};1)))-77,5)<=12,5;));{1;1})=2);ROW($1:$99)))+1;5)
Изменено: БМВ - 01.12.2020 23:41:15 (Файл в сообщении далее.)
По вопросам из тем форума, личку не читаю.
 
Цитата
buchlotnik написал:
а как же строка 12?
Исправил оплошность в файле примера, точка всегда предшествует искомому фрагменту
Спасибо за решение проблемы на уровне кода VBA, если не найду формулу, применю!
Изменено: Сергей М. - 01.12.2020 08:39:12
 
msi2102, великолепная альтернатива спасибо за помощь!

БМВ, благодарю за решение формулой!! Красиво, потребуется время осмыслить логику формулы, здорово вам это удалось!
Изменено: Сергей М. - 01.12.2020 08:54:35
 
А кто предложит нормальное название темы?
 
Я не исправлял :-)
По вопросам из тем форума, личку не читаю.
 
Сергей М., помогающим и название вместо Вас предлагать?

- Вы вместо меня и кушат будете?
- Ага!  :)
 
Тема:
Поиск фрагмента текста по маске
 
под вечер навеяло
=MID(A1;MIN(IF(MMULT(--IFERROR(ABS(CODE(UPPER(MID(A1;ROW($1:$99)+{0\1\2\3\4\5};1)))-{46\49,5\52,5\85\77,5\77,5})<={0\0,5\4,5\0\12,5\12,5};);{1;1;1;1;1;1})=6;ROW($1:$99)))+1;5)
а для конкретного примера можно даже так
=MID(A1;MIN(IF(MMULT(--IFERROR(ABS(CODE(MID(A1;ROW($1:$99)+{0\1\2\3\4\5};1))-{46\49,5\52,5\85\77,5\77,5})<={0\0,5\4,5\0\12,5\12,5};);{1;1;1;1;1;1})=6;ROW($1:$99)))+1;5)
Изменено: БМВ - 01.12.2020 23:40:49
По вопросам из тем форума, личку не читаю.
 
OFF
Цитата
БМВ: навеяло
ты бы проветривал почаще, Миш  :D
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
OFF
Цитата
Jack Famous написал:
ы бы проветривал почаще
такое просто так не выветришь.  :D
По вопросам из тем форума, личку не читаю.
 
Цитата
точка всегда предшествует искомому фрагменту
Код
Function GetText(cell$)
  With CreateObject("VBScript.RegExp")
    .Pattern = "\.((1|2)\dU[A-Z]{2})"
    GetText = .Execute(cell)(0).SubMatches(0)
  End With
End Function
Страницы: 1
Наверх