Excel - определить шаблон и извлечь подстроку - PullRequest
1 голос
/ 30 апреля 2020

Кто-нибудь имеет представление о том, как мне лучше всего извлечь подстроку из ячейки в Excel?

У меня есть тысячи строк в Excel, где внутри случайного текста есть такие периоды, как «31.12.2019-30.12.2020», и мне нужно извлечь эту подстроку из каждой строки и поместить ее в отдельную ячейку. Подстрока всегда имеет один и тот же шаблон, но сам текст всегда отличается, и он может находиться в любом месте текста.

Может быть, с помощью формулы или с помощью VBA можно точно идентифицировать этот шаблон: «XX.XX.20XX-XX.XX.20XX», а затем вернуть подстроку? Но я не смог найти формулу через Google, но, возможно, кто-нибудь из вас делал это раньше?

enter image description here

С наилучшими пожеланиями AnSa

Ответы [ 2 ]

0 голосов
/ 30 апреля 2020

Другое решение формулы.

В B1, формула скопирована:

=MID(A2,FIND("-",A2)-10,21)

enter image description here

0 голосов
/ 30 апреля 2020

1) - Формула Excel

Если вы go используете маршрут Формула Excel, используйте B2:

=MID(A2,SEARCH("??.??.20??-??.??.20??",A2),21)

Перетащите вниз ...

Функция SEARCH поддерживает символы подстановки, такие как ? (что обозначает любой символ), и, таким образом, возвращает начальную позицию интересующей подстроки. При использовании в MID мы можем фактически извлечь эту подстроку.


2) - VBA

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

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

Public Function RegExtract(Txt As String, Pattern As String) As String

With CreateObject("vbscript.regexp")
    '.Global = True
    .Pattern = Pattern
    If .test(Txt) Then
        RegExtract = .Execute(Txt)(0)
    Else
        RegExtract = "No match found"
    End If
End With

End Function

Вы можете назвать это в B2 через =RegExtract(A2,"\d\d\.\d\d\.20\d\d-\d\d\.\d\d\.20\d\d")

Как вы можете видеть, картина довольно проста:

Regular expression visualization


Результаты:

enter image description here

...