Разделить слова в 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