在Excel中拆分大写单词

时间:2012-04-17 11:23:22

标签: regex excel vba excel-vba excel-formula

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

原始值:

MikeJones
RinaJonesJunior
MichealSamuelsLurth

预期产出:

Mike Jones
Rina Jones Junior
Micheal Samuels Lurth

这可以在不使用VBA的情况下完成吗?

6 个答案:

答案 0 :(得分:25)

在承认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

答案 1 :(得分:17)

这是一个工作表函数解决方案。它并不漂亮,但是如果你完全不喜欢使用VBA,那么我认为你只会遇到丑陋的选择。对于A1中的文字,将以下内容粘贴到B1并按 Ctrl + Shift + 输入以输入公式作为数组公式:

=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

如果你倾向于跳下兔子洞,这里有一个简要说明公式的作用:

  1. 检查每个字符是否在大写字母的ASCII范围内,而不是以空格开头。跳过名称的第一个字符。
  2. 如下所示填充大小等于字符串长度(减1)的数组:如果找到匹配项,则存储字符串,匹配字符由其前面的空格替换。如果未找到匹配项,则存储原始字符串。
  3. 返回此数组中与匹配项对应的第一个元素。如果未找到匹配项,则返回原始字符串。

答案 2 :(得分: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中的数据 - &gt; “MikeJones” 你想要在A2单元格中回答。所以在A2中,你输入

=splitbycaps(A1)

你会得到你的输出。 HTH。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

这可以作为用户定义的函数。

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

答案 5 :(得分:-2)

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