在Excel中分割大写单词

我想用大写字母将单元格中的所有单词分开,例如:

原始值:

MikeJones RinaJonesJunior MichealSamuelsLurth 

预期产出:

 Mike Jones Rina Jones Junior Micheal Samuels Lurth 

这可以做到不使用VBA?

承认Excellll卓越的公式,最有效的代码解决scheme将基于RegExp 。 这避免了长循环。

在这里输入图像说明

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

这是一个工作表function解决scheme。 这不是很好,但是如果你完全不愿意使用VBA,那么我认为你只能用丑陋的选项卡住。 对于A1文本,将以下内容粘贴到B1 ,然后按Ctrl + Shift + Enter将公式作为数组公式input:

 =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有一个名称列表,并且您认为任何名称中的大多数单词都是四个,则可以在B1input公式(作为数组公式!),填入B10 ,然后填写正确的E10 。 您的分割名称列表将在E1:E10

样品使用公式

如果你倾向于跳下兔子洞,下面简单解释公式的作用:

  1. 检查每个字符,看它是否在大写字母的ASCII范围内,而不是以空格开头。 该名称的第一个字符被跳过。
  2. 大小等于string长度(减1)的数组填充如下:如果find匹配项,则将string与其前面的空格replace为匹配字符。 如果没有find匹配,则存储原始string。
  3. 返回该数组中对应于匹配项的第一个元素。 如果找不到匹配,则返回原始string。

既然你说你不想使用VBAmacros,但问题需要VBA,我认为UDF将是一个很好的解决scheme。 这是一个可以使用的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 

您现在可以直接在单元格中使用该function。 假设你有A1中的数据 – >“MikeJones”而你想在单元格A2中回答。 所以在A2中,你input

 =splitbycaps(A1) 

你会得到你的输出。 HTH。

你必须用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 

这将作为用户定义的function。

 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 
 Sub caps_small() strIn = InputBox("Enter a string:") For i = 1 To Len(strIn) If Mid(strIn, i, 1) Like "[AZ]" Then cap = Mid(strIn, i, 1) capstr = capstr & cap ElseIf Mid(strIn, i, 1) Like "[az]" Then sml = Mid(strIn, i, 1) smlstr = smlstr & sml End If Next MsgBox capstr MsgBox smlstr End Sub