Предположим, у меня есть электронная таблица Excel со следующим столбцом:

А-345 привет

Привет B-389

хороший C-6231

что A-12287 кто

просто А-7819, С-45556

Как вы можете видеть - у меня есть текст, объединенный с некоторыми RegEx, состоит из A, B или C, дефиса и некоторого числа длиной до 5-6 цифр. Некоторые из этих выражений встречаются в некоторых строках более одного раза.

Я хотел бы проанализировать этот RegEx (который несколько варьируется между строками) в другой столбец. Если в какой-то строке есть несколько выражений (например, 5-я строка в моем примере), то я бы хотел разделить их любым символом, который не является дефисом (пробел будет делать это).

Есть ли встроенная функция в Excel, которая позволяет мне это делать? Может быть, какой-нибудь скрипт VBA?

Я нашел эту ветку, но сначала хотел бы узнать, смогу ли я сделать это без каких-либо внешних надстроек или программного обеспечения. Эта конкретная надстройка поддерживает то, что мне нужно?

1 ответ1

1

Если вы хотите встроенную функцию, вы можете сделать эту формулу массива:

=TEXTJOIN(" ",TRUE,IFERROR(--LEFT(TRIM(MID(SUBSTITUTE(A1,"-",REPT(" ",999)),ROW(INDIRECT("1:" & LEN(A1)-LEN(SUBSTITUTE(A1,"-",""))))*999,999)),FIND(" ",TRIM(MID(SUBSTITUTE(A1,"-",REPT(" ",999)),ROW(INDIRECT("1:" & LEN(A1)-LEN(SUBSTITUTE(A1,"-",""))))*999,999))&" ")-1),""))

Будучи формулой массива, она должна быть подтверждена Ctrl-Shift-Enter вместо Enter при выходе из режима редактирования. Если все сделано правильно, тогда Excel поместит {} вокруг формулы.

Замечания:

Это вернет первую группу номеров после каждого -


TEXTJOIN() доступен с подпиской на Office 365 Excel. Если у вас его нет, добавьте этот код в модуль, прикрепленный к книге, и используйте формулу, как описано выше:

Function TEXTJOIN(delim As String, skipblank As Boolean, arr)
    Dim d As Long
    Dim c As Long
    Dim arr2()
    Dim t As Long, y As Long
    t = -1
    y = -1
    If TypeName(arr) = "Range" Then
        arr2 = arr.Value
    Else
        arr2 = arr
    End If
    On Error Resume Next
    t = UBound(arr2, 2)
    y = UBound(arr2, 1)
    On Error GoTo 0

    If t >= 0 And y >= 0 Then
        For c = LBound(arr2, 1) To UBound(arr2, 1)
            For d = LBound(arr2, 1) To UBound(arr2, 2)
                If arr2(c, d) <> "" Or Not skipblank Then
                    TEXTJOIN = TEXTJOIN & arr2(c, d) & delim
                End If
            Next d
        Next c
    Else
        For c = LBound(arr2) To UBound(arr2)
            If arr2(c) <> "" Or Not skipblank Then
                TEXTJOIN = TEXTJOIN & arr2(c) & delim
            End If
        Next c
    End If
    TEXTJOIN = Left(TEXTJOIN, Len(TEXTJOIN) - Len(delim))
End Function

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .