TL; DR сводка: я хочу формулу, которая найдет N-ное "_
" (для любого N) в строке и вернет ее индекс; ИЛИ найти N-ю подстроку, разделенную "_
". У меня есть VBA, чтобы сделать это, но это медленно.
Длинная версия:
Я работаю с данными рекламной кампании. Мои маркетологи (к счастью) используют последовательную схему именования для своих кампаний. К сожалению, это очень долго.
Названия кампаний содержат ровно 1 часть данных, которые я не могу получить из отчетов.
Для справки названия кампаний имеют формат:
ADV_CO_BG_Product_UniqueID_XX_mm.dd.yyyy_mm.dd.yyyy_TYP_NUM
... и у меня есть столбец около 200K из них (растет на пару сотен каждую неделю).
Edit:
Важной частью является то, что в названии кампании есть несколько частей, между которыми стоит _
. В этом случае мне нужна 9-я часть, но я хочу, чтобы опция была достаточно гибкой, чтобы мне не нужно было добавлять или удалять строки, чтобы изменить какую часть я нацеливаю.
Я видел в других вопросах, как использовать вложенную формулу, такую как:
=MID(
Data_OLV[@Campaign],
FIND("_",Data_OLV[@Campaign],
FIND("_",Data_OLV[@Campaign],
FIND("_",Data_OLV[@Campaign],
FIND("_",Data_OLV[@Campaign],
FIND("_",Data_OLV[@Campaign],
FIND("_",Data_OLV[@Campaign],
FIND("_",Data_OLV[@Campaign],
FIND("_",Data_OLV[@Campaign])+1)
+1)
+1)
+1)
+1)
+1)
+1)
+1,
3)
... но это трудно изменить, если мне нужно что-то в другой позиции.
У меня есть UDF под названием StringSplit (см. Ниже), который обеспечивает желаемые результаты, но он очень медленный (и работает только при включении макросов, что не вся моя аудитория).
Есть ли лучший способ сделать то, что я пытаюсь сделать?
Public Function StringSplit(input_ As String, delimiter_ As String, index_ As Integer)
On Error GoTo err
out = Split(input_, delimiter_, -1, vbTextCompare)
StringSplit = out(index_ - 1)
Exit Function
err:
If err.Number = 9 Then
StringSplit = CVErr(xlErrRef)
Exit Function
End If
StringSplit = err.Description
End Function