Как разделить строку на несколько строк, если значение равно 4 числам

#excel #vba

Вопрос:

Следующее разделит выделенное текстовое значение разделителем «1234».

 Sub SPLIT()
    Dim x As Variant
        x = Split(Selection, "1234")
        With ActiveSheet
        For ii = LBound(x) To UBound(x)
            .Cells(1   ii, 1).Value = x(ii)
        Next ii
    End With
End Sub
 

Тем не менее, я хотел бы разделить текст на разделитель»####», где # — любое заданное число.
Также должно быть пустое пространство впереди и в конце разделителя.
Я предполагаю, что здесь требуется регулярное выражение, но я не знаю, как это сделать в данном случае.

Пример:
блабла 1234 блабла блабла бла 7548, блабла 7854 бла 154 блабла

Желаемый результат:
блабла
1234 блабла блабла бла 7548, блабла
7854 бла 154 блабла

Комментарии:

1. разделите на " " , и если элемент не числовой с len 4, то новая строка.

2. d{4} это шаблон для 4 чисел. Хотя подход Warcupine в этом не нуждается.

3. @SJR, потому что за номером стоит»,», и он хочет разделить его, только если перед номером и за ним есть пробелы.

Ответ №1:

Вы можете обойти это с помощью регулярных выражений. Вот пример:

 Sub Test()

Dim Str As String: Str = "blabla 1234 blabla blablabla bla 7548, blablabl 7854 bla 154 blablabla"
Dim newStr As String
With CreateObject("vbscript.regexp")
    .Global = True
    .Pattern = " (d{4} )"
    newStr = .Replace(Str, Chr(10) amp; "$1")
End With
Debug.Print newStr

End Sub
 

Кроме того, посмотрите онлайн-демонстрацию, где шаблон будет означать:

  • — Буквальное пространство.
  • ( — Открыть 1-ю группу захвата:
    • d{4} — Четыре цифры в диапазоне от 0 до 9.
    • — Буквальное пространство.
    • ) — Закрыть 1-ю группу захвата.

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

Наш конечный результат будет выглядеть так:

введите описание изображения здесь


Редактировать:

Если ваша цель состояла в том, чтобы разбиться на разные элементы, вы можете попробовать:

 Sub Test()

Dim Str As String: Str = "blabla 1234 blabla blablabla bla 7548, blablabl 7854 bla 154 blablabla"
Dim newStr() As String
With CreateObject("vbscript.regexp")
    .Global = True
    .Pattern = " (d{4} )"
    newStr = Split(.Replace(Str, "|$1"), "|")
End With

End Sub
 

введите описание изображения здесь

Ответ №2:

Это должно сработать. Я помещаю вашу строку в A1 и выводю в B1:B3

     Dim mystr As String
    Dim strarr As Variant
    
    With Sheet1
        mystr = .Cells(1, 1).Value
        
        strarr = Split(mystr, " ")
        
        Dim ele As Variant
        Dim outputrange As Range
        Set outputrange = .Cells(1, 2)
        For Each ele In strarr
            If Len(ele) = 4 And IsNumeric(ele) Then
                Set outputrange = outputrange.Offset(1)
            End If
            If outputrange.Value = "" Then
                outputrange.Value = ele
            Else
                outputrange.Value = outputrange.Value amp; " " amp; ele
            End If
        Next ele
    End With