Похоже, что вы не хотите включать пустые сегменты при определении того, что возвращать.
В этом случае вы также можете использовать регулярное выражение:
Option Explicit
Function extrSegment(S As String, Optional Segment As Long = 3) As String
Dim RE As Object
Set RE = CreateObject("vbscript.regexp")
With RE
.Pattern = "([^|]+)"
.Global = True
If .Test(S) = True Then
extrSegment = .Execute(S)(Segment - 1).submatches(0)
End If
End With
End Function
Обратите внимание, что в функции есть необязательный аргумент для возвращаемого сегмента, где 1
- первый сегмент.
Вы также можете сделать это с формулой рабочего листа, особенно если у вас Excel 2013+ с FILTERXML
function:
=FILTERXML("<t><s>" & SUBSTITUTE(A1,"|","</s><s>")& "</s></t>","//s[text()!=''][3]")
Эта формула также исключит пустые сегменты, из определения которых # 3. Однако если сегмент имеет начальные нули, они будут удалены функцией FILTERXML
.
Оба метода приводят к:
Редактировать:
Если вы хотите включить в счетчик пустые узлы / сегменты, вы можете удалить текстовый тест из xPath
в формуле.
Если вы сделаете это, FILTERXML
вернет ошибку для пустого узла, поэтому нам нужно проверить это:
=IFERROR(FILTERXML("<t><s>" & SUBSTITUTE(E1,"|","</s><s>")& "</s></t>","//s[3]"),"")
и UDF можно упростить до:
Function extrSegment(S As String, Optional Segment As Long = 4, Optional Delimiter As String = "|") As String
extrSegment = Split(S, Delimiter)(Segment-1) 'array will be 0-based
End Function