VBA Разбиение строки на несколько ячеек, когда у нее переменные разделители - PullRequest
0 голосов
/ 28 января 2019

Если у меня есть вся информация ниже, содержащаяся в одной ячейке, и я хочу разделить ее на отдельные ячейки.Я понимаю, как использовать пробел в качестве разделителя, но в этом случае в имени также есть пробелы, и я хочу, чтобы имя оставалось вместе в одной ячейке.Чтобы еще больше усложнить ситуацию, имя не всегда является первым и последним, оно также может включать в себя среднее, поэтому не всегда два стандартных имени.

2172571122  Jane Doe 3143332222 John Doe

2172242237 Mary Mixer 2223334444 Mike M Martin

Хотите, чтобы оно выглядело так:*

Cell 1 = 2172242237 
Cell 2 = Mary Mixer 
Cell 3 = 2223334444 
Cell 4 = Mike M Martin

Есть предложения?

Ответы [ 4 ]

0 голосов
/ 28 января 2019

Дополнительный вариант к уже опубликованному:

Sub ZZZ()
    Dim dic As Object: Set dic = CreateObject("Scripting.Dictionary")
    Dim num$, cl As Range, data As Range, key, x
    Dim Result As Worksheet
    Set data = Range([A1], Cells(Rows.Count, "A").End(xlUp))
    For Each cl In data
        x = "": num = "":
        For Each x In Split(cl, " ")
            If IsNumeric(x) Then
                num = x
                dic.Add x, ""
            ElseIf x <> "" And num <> "" Then
                dic(num) = Trim(dic(num) & " " & x)
            End If
        Next x
    Next cl
    Set Result = Worksheets.Add
    With Result
        .Name = "Result " & Replace(Now, ":", "-")
        x = 1
        For Each key In dic
            .Cells(x, "A").Value2 = key
            .Cells(x, "B").Value2 = dic(key)
            x = x + 1
        Next key
        .Columns("A:B").AutoFit
    End With
End Sub

тест: enter image description here

0 голосов
/ 28 января 2019

Вы можете попробовать:

Option Explicit

Sub test()

    Dim strToSplit As String, strImport As String
    Dim arrwords As Variant
    Dim i As Long, counter As Long

    With ThisWorkbook.Worksheets("Sheet1")
        strToSplit = .Range("A1").Value
        arrwords = Split(strToSplit, " ")

        counter = 1

        For i = LBound(arrwords) To UBound(arrwords)

            If IsNumeric(arrwords(i)) = True Then
                strImport = arrwords(i)
                .Cells(3, counter).Value = strImport
                counter = counter + 1
            ElseIf Not IsNumeric(arrwords(i)) = True Then
                If Not IsNumeric(.Cells(3, counter - 1).Value) Then
                    strImport = .Cells(3, counter - 1) & " " & arrwords(i)
                    .Cells(3, counter - 1).Value = strImport
                    counter = counter
                Else
                    strImport = arrwords(i)
                    .Cells(3, counter).Value = strImport
                    counter = counter + 1
                End If
            End If

        Next

    End With

End Sub

Результаты выглядят так:

enter image description here

0 голосов
/ 28 января 2019

Эта функция на основе регулярных выражений чередует каждое разбиение между числами и текстом (словами).

Option Explicit

Function customSplit(str As String, _
                     Optional ndx As Integer = 1) As Variant

    Static rgx As Object, cmat As Object

    Set rgx = CreateObject("VBScript.RegExp")

    With rgx
        .Global = True
        .MultiLine = True
        .IgnoreCase = True
        If CBool(ndx Mod 2) Then
            .Pattern = "[0-9]{10}"
            ndx = (ndx + 1) \ 2
        Else
            .Pattern = "[A-Z]{1,9}\s[A-Z]{1,9}[\s[A-Z]{1,9}]?"
            ndx = ndx \ 2
        End If
        If .test(str) Then
            Set cmat = .Execute(str)
            If ndx <= cmat.Count Then
                customSplit = cmat.Item(ndx - 1)
            End If
        End If
    End With

End Function

enter image description here

0 голосов
/ 28 января 2019

У меня есть несколько идей о том, что вы могли бы сделать.

1) Считать строку

Выполните split(line, " ") и выполните цикл между значениями, выполняя isNumeric() для каждого значения разделения.Если нет, то добавьте в строку Array () и установите для флага значение true.

Затем, если оно не числовое, ожидайте другое имя и установите для флага значение true.

2) Считайте строку.

Затем выполните цикл по каждому символу, выполняющему isnumeric, и, если нет, добавьте этот символ в строку Array () и установите флаг до isnumeric снова и т. Д. *

Я надеюсь, что это поможет или, по крайней мере, приведет вас в правильном направлении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...