【问题标题】:Split Uppercase words in Excel在 Excel 中拆分大写单词
【发布时间】:2012-04-28 17:39:40
【问题描述】:

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

原始值:

MikeJones
RinaJonesJunior
MichealSamuelsLurth

预期输出:

Mike Jones
Rina Jones Junior
Micheal Samuels Lurth

不使用 VBA 可以做到吗?

【问题讨论】:

  • 我认为不使用 VBA 是不可能的。
  • 有可能;这不是很实用(见下文)。

标签: regex vba excel excel-formula


【解决方案1】:

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

【讨论】:

  • 我希望您能提供 RegEx 解决方案!这似乎是要走的路。
  • 这对我来说非常方便,但我将如何调整它来拆分大写字母但添加 2 个空格而不是 1 个空格,例如 Mike Jones? TIA。
  • @d1ch0t0my 使用SplitCaps = .Replace(strIn, "$1 $2")
  • 很好的答案,有没有办法在这个函数中包含下划线和数字?即用空格替换下划线,用空格分割数字,类似于大写。
【解决方案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 中输入公式(作为数组公式!),填写到@987654328 @,然后向右填写E10。您的拆分名称列表将位于 E1:E10

如果你倾向于跳下兔子洞,这里是公式的简要说明:

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

【讨论】:

  • +1 充分利用原生 excel 函数。不知道你是怎么做到的!
  • @Remnant,前几天我发表了一篇文章,其中涵盖了相当多的这些功能,用于类似的问题。如果您有兴趣,请访问:yoursumbuddy.com/solving-the-npr-sunday-puzzle-3。当我看到 Excellll 让我领先一英里时,我正试图为这个问题拼凑出一个答案:)。
  • + 1 不错的 :-) 丑?好吧,美丽在于旁观者的眼中 LOL +1 Doug ;)
  • 问题是,你的公式会在合法的缩写中插入空格,比如“KFC”,这将变成“K F C”。
  • 这也可以在 Google 电子表格中按原样(只需粘贴)。
【解决方案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)

你会得到你的输出。 HTH。

【讨论】:

  • UDF 绝对是要走的路,但下面@brettdj 的正则表达式示例可能更有效。至少这个应该从 char 2 开始
【解决方案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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-01-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多