Разделить слова в Excel

Я хотел бы разбить все слова в моей ячейке по Uppercase, пример:

Исходные значения:

MikeJones
RinaJonesJunior
MichealSamuelsLurth

Ожидаемый результат:

Mike Jones
Rina Jones Junior
Micheal Samuels Lurth

Можно ли это сделать без использования VBA?

Ответы

Ответ 1

Признав замечательную формулу Excellll, наиболее эффективным решением для кода было бы RegExp. Это позволяет избежать длинных циклов.

enter image description here

Function SplitCaps(strIn As String) As String
Dim objRegex As Object
Set objRegex = CreateObject("vbscript.regexp")
With objRegex
    .Global = True
    .Pattern = "([a-z])([A-Z])"
    SplitCaps = .Replace(strIn, "$1 $2")
End With
End Function

Ответ 2

Здесь находится решение функции рабочего листа. Это некрасиво, но если вы полностью не любите использовать VBA, то я думаю, что вы застряли в уродливых вариантах. Для текста в A1 вставьте следующее в B1 и нажмите Ctrl + Shift + Enter, чтобы ввести формулу в виде формулы массива:

=IFERROR(INDEX(IF(CODE(MID(D1,ROW(INDIRECT("A2:A"&LEN(D1))),1))<=90,IF(CODE(MID(D1,ROW(INDIRECT("A2:A"&LEN(D1))),1))>=65,IF(MID(D1,ROW(INDIRECT("A1:A"&LEN(D1)-1)),1)<>" ",REPLACE(D1,ROW(INDIRECT("A2:A"&LEN(D1))),1," "&MID(D1,ROW(INDIRECT("A2:A"&LEN(D1))),1)),D1),D1),D1),MIN(IF(CODE(MID(D1,ROW(INDIRECT("A2:A"&LEN(D1))),1))<=90,IF(CODE(MID(D1,ROW(INDIRECT("A2:A"&LEN(D1))),1))>=65,IF(MID(D1,ROW(INDIRECT("A1:A"&LEN(D1)-1)),1)<>" ",ROW(INDIRECT("A1:A"&LEN(D1)-1)),2000000),2000000),2000000))),D1)

Я сказал, что это было уродливо!

И для всех этих усилий это разделит только первое и второе имя. Для большего количества расколов заполните формулу справа. Например, если у вас есть список имен в A1:A10, и вы считаете, что большинство слов в любом имени четыре, вы можете ввести формулу в B1 (как формулу массива!), Заполнить до B10, затем заполните права на E10. Ваш список разделенных имен будет находиться в E1:E10.

sample use of formula

Если вы склонны прыгать вниз по кроличьей дыре, здесь кратко объясняется, что делает формула:

  • Проверьте каждый символ, чтобы увидеть, находится ли он в диапазоне ASCII для заглавных букв и не предшествует пробелу. Первый символ имени пропущен.
  • Массив, равный по размеру длине строки (минус 1), заполняется следующим образом: если совпадение найдено, строка сохраняется с заменяющим символом вместо предшествующего пробела. Если совпадение не найдено, исходная строка сохраняется.
  • Возвращается первый элемент из этого массива, соответствующий совпадению. Если совпадение не найдено, возвращается исходная строка.

Ответ 3

Поскольку вы говорите, что не хотите использовать макрос VBA, но проблема требует VBA, я думаю, что UDF станет хорошим решением для вас. Это UDF (пользовательская функция), которую вы можете использовать. Поместите этот код в общий модуль того же файла, в котором есть данные.

Function splitbycaps(inputstr As String) As String

Dim i As Long
Dim temp As String

If inputstr = vbNullString Then
    splitbycaps = temp
    Exit Function
Else
    temp = inputstr
    For i = 1 To Len(temp)
        If Mid(temp, i, 1) = UCase(Mid(temp, i, 1)) Then
            If i <> 1 Then
                temp = Left(temp, i - 1) + " " + Right(temp, Len(temp) - i + 1)
                i = i + 1
            End If
        End If
    Next i
    splitbycaps = temp

End If
End Function

Теперь вы можете использовать функцию непосредственно в ячейке. Предположим, что у вас есть данные в A1 → "MikeJones" И вы хотите ответить в ячейке A2. Итак, в A2 вы вводите

=splitbycaps(A1)

И вы получите свой результат. НТН.

Ответ 4

вам нужно сделать это с помощью VBA.

Sub insertspaces()
Range("A1").Select
Do
    Row = ActiveCell.Row
    Column = ActiveCell.Column
    vlaue = ActiveCell.Value
    If vlaue = "" Then Exit Do
        Length = Len(vlaue)
        If Length > 1 Then
            For x = Length To 2 Step -1
            par = Mid(vlaue, x, 1)
            cod = Asc(par)
            If (cod > 64 And cod < 91) Or (cod > 191 And cod < 222) Then
            vlaue = Left(vlaue, x - 1) + " " + Mid(vlaue, x)
            End If
        Next
        ActiveCell.Value = vlaue
        End If
    Row = Row + 1
    Cells(Row, Column).Select
Loop
End Sub

Ответ 5

Это будет работать как пользовательская функция.

Function SplitOnCapital(str As String) As String
    Dim letter As Byte, result As String

    For letter = 2 To Len(str)
        If Asc(VBA.Mid$(str, letter, 1)) < 90 Then //65 to 90 are char codes for A to Z
            result = WorksheetFunction.Replace(str, letter, 0, " ")
            letter = letter + 1
        End If
    Next letter

    SplitOnCapital = result
End Function

Ответ 6

Sub caps_small()

strIn = InputBox("Enter a string:")

For i = 1 To Len(strIn)

    If Mid(strIn, i, 1) Like "[A-Z]" Then
        cap = Mid(strIn, i, 1)
        capstr = capstr & cap

    ElseIf Mid(strIn, i, 1) Like "[a-z]" Then
        sml = Mid(strIn, i, 1)
        smlstr = smlstr & sml
    End If
Next

MsgBox capstr

MsgBox smlstr


End Sub