Это можно сделать с помощью формулы, но все зависит от вашей версии Excel:

1) Excel 2016, you could still use a formula:
Formula in B1
:
=IFERROR(MID(A1,MAX((MID(A1,ROW(A$1:INDEX(A:A,LEN(A1))),1)="1")*(ISNUMBER(--MID(A1,ROW(A$1:INDEX(A:A,LEN(A1))),8)))*(NOT(ISNUMBER(--MID(A1,ROW(A$1:INDEX(A:A,LEN(A1)))+8,1))))*(NOT(ISNUMBER(--MID(A1,ROW(A$1:INDEX(A:A,LEN(A1)))-1,1))))*(ROW(A$1:INDEX(A:A,LEN(A1))))),8),"Nothing found")
Note: This is an array formula and needs to be confirmed through CtrlShiftEnter
2) Excel 2019, using CONCAT
и FILTERXML
:
Формула в B1
:
=IFERROR(FILTERXML("<t><s>"&CONCAT(IF(ISNUMBER(--MID(A1,ROW(A$1:INDEX(A:A,LEN(A1))),1)),MID(A1,ROW(A$1:INDEX(A:A,LEN(A1))),1),"</s><s>"))&"</s></t>","//s[starts-with(., '1') and string-length(.) =8]"),"Nothing Found")
Примечание: Это формула массива, и ее необходимо подтвердить с помощью Ctrl Shift Введите
3) Excel 365, с использованием ранее упомянутых функций, но включая SEQUENCE
:
Формула в B1
:
=IFERROR(FILTERXML("<t><s>"&CONCAT(IF(ISNUMBER(--MID(A1,SEQUENCE(LEN(A1)),1)),MID(A1,SEQUENCE(LEN(A1)),1),"</s><s>"))&"</s></t>","//s[starts-with(., '1') and string-length(.) =8]"),"Nothing Found")
Часть формул XPATH
заботится о фактическом запросе, ища строки, которые начинаются с «1» и имеют общую длину «8». Тогда это будет работать даже со строками вроде 'abc123456789abc12345678abc29876543', возвращающими '12345678'.
Если вам нравятся FILTERXML
и XPATH
, тогда это может показаться вам интересным.
4) VBA: если вы должны использовать VBA, я думаю, что UDF - хороший вариант. Примерно так:
Function GetStr(str As String, pat As String) As String
With CreateObject("vbscript.regexp")
.Pattern = pat
.Global = True
If .Test(str) = True Then
GetStr = .Execute(str)(0).Submatches(0)
Else
GetStr = "Nothing found"
End If
End With
End Function
Вы можете вызвать это в B1
согласно =GetStr(A1,"(?:^|\D)(1\d{7})(?:\D|$)")
. Это использование регулярного выражения. Если вам интересно и вы хотите узнать больше, тогда это - интересное чтение для вас.
Я специально оставил шаблон вне UDF, возможно, вы когда-нибудь захотите его изменить. Текущий шаблон можно увидеть в этой онлайн Demo , где слева направо движок будет искать:
(?:
- 1-я группа без захвата ^|\D
- Либо начальная строка ancor, либо что-то другое, кроме di git. )
- Закрыть 1-ю группу без захвата.
(
- 1-я группа захвата. 1\d{7}
- поиск литерала 1, за которым следуют 7 цифр. )
- закрытие 1-й группы захвата.
(?:
- 2-я группа без захвата \D|$
- Любое другое значение, кроме di git или ancor в конце строки. )
- Закройте 2-ю группу без захвата.
введите описание изображения здесь