我想用大写字母拆分单元格中的所有单词,例如:
原始值:
MikeJones
RinaJonesJunior
MichealSamuelsLurth
预期输出:
Mike Jones
Rina Jones Junior
Micheal Samuels Lurth
这可以在不使用 VBA 的情况下完成吗?
我想用大写字母拆分单元格中的所有单词,例如:
原始值:
MikeJones
RinaJonesJunior
MichealSamuelsLurth
预期输出:
Mike Jones
Rina Jones Junior
Micheal Samuels Lurth
这可以在不使用 VBA 的情况下完成吗?
承认 Excellll 卓越的公式后,最有效的代码解决方案将RegExp
基于此。这避免了长循环。
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
这是一个工作表功能解决方案。它不是很漂亮,但如果你完全反对使用 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
.
如果您倾向于跳下兔子洞,这里简要解释一下公式的作用:
既然你说你不想使用 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)
你会得到你的输出。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 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 "[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