Следующая UDF будет извлекать все, что вы вводите, в список с разделителями-запятыми только AK
номеров билетов. Предполагается, что шаблон номера билета AK-
, за которым следуют только цифры, что вы и показываете. Извлекаются только номера билетов и то, что вы говорите, что хотите.
- Если вы введете одну строку или одну ячейку, это содержимое появится.
- Если вы введете диапазон ячеек, они будут объединены в одну строку вывода.
- Механизм регулярных выражений VBA используется для извлечения номеров билетов
Option Explicit
Public RE As Object
Public MC As Object
Public M As Object
'Assume starts with AK- and ends with numbers
' as per your example
Public Const sPat As String = "\bAK1-\d+"
Function getAK(vIN As Variant) As String
Dim V As Variant
Dim sTemp As String
Set RE = CreateObject("vbscript.regexp")
With RE
.Pattern = sPat
.ignorecase = False
.Global = True
End With
If IsArray(vIN) Then
For Each V In vIN
sTemp = sTemp & "," & getStrOnly(CStr(V))
Next V
Else
getAK = getStrOnly(CStr(vIN))
Exit Function
End If
getAK = Mid(sTemp, 2)
End Function
Private Function getStrOnly(str As String) As String
Dim sTemp As String
With RE
If .test(str) = True Then
Set MC = .Execute(str)
For Each M In MC
sTemp = sTemp & "," & M
Next M
End If
End With
getStrOnly = Mid(sTemp, 2)
End Function
Использование версии с одной ячейкой: getAK(A1)
:
Использование метода нескольких ячеек:
=getAK(A1:A12)
получаем
AK1-97760,AK1-96767,AK1-97719,AK1-97999,AK1-98105,,AK1-97113,AK1-97073,AK1-97019,AK1-97951,AK1-97858,AK1-97195,AK1-96806,AK1-97719,AK1-97896,AK1-98115,AK1-98151,AK1-98089,AK1-96780,AK1-90919,AK1-96705,AK1-96806,AK1-95397
Если вы также хотите вернуть статус заявки (часть в скобках после номера заявки), вы можете изменить регулярное выражение на:
"\bAK1-\d+(?:\s*\([^)]+\))?"
И если ваши шаблоны билетов отличаются, вы также можете соответствующим образом изменить регулярное выражение.