在单元格中的第二个大写字母之前添加空格

时间:2014-08-01 20:33:11

标签: excel-formula

我有一张Excel工作表,其中包含一个名称列,每个名称都以firstname capitalize和lastname大写。像JohnSmith一样

我想知道是否有一种方法可以让JohnSmith成为约翰史密斯。请帮忙

谢谢

3 个答案:

答案 0 :(得分:1)

最好的答案是在Excel中使用宏。

Function AddSpaces(pValue As String) As String

Dim xOut As String
Dim iCounter As Integer
Dim xAsc As Variant

xOut = VBA.Left(pValue, 1)
For iCounter = 2 To VBA.Len(pValue)
   xAsc = VBA.Asc(VBA.Mid(pValue, iCounter, 1))
   If xAsc >= 65 And xAsc <= 90 Then

        If VBA.Mid(pValue, iCounter - 1, 2) = "ID" Then
        'StrComp(str1, str2, vbTextCompare)
            xOut = xOut & VBA.Mid(pValue, iCounter, 1)
        Else
            xOut = xOut & " " & VBA.Mid(pValue, iCounter, 1)
        End If
   Else
      xOut = xOut & VBA.Mid(pValue, iCounter, 1)
   End If
Next
AddSpaces = xOut
End Function

最初不是我的代码,从其他地方复制,改变了一些变量来支持变量的显式声明。

答案 1 :(得分:0)

如前所述,您可以使用@Derrik链接的线程中列出的多个公式, 但我认为它们看起来都很长而且很麻烦。 我个人最喜欢的是:

=trim(REGEX.SUBSTITUTE(A1,"([A-Z])"," [1]"))

这需要Morefunc Addon(见下文,它还有许多其他有用的功能)


MOREFUNC ADDON

答案 2 :(得分:0)

从Derik的链接中,你可以使用这个数组公式(意味着你必须用ctrl + shift + enter确认它,而不是只输入):

=MIN(IF(ISERROR(FIND(CHAR(ROW(INDIRECT("65:90"))),C2,2)),"",FIND(CHAR(ROW(INDIRECT("65:90"))),C2,2)))

虽然我将其修改为从第二个角色开始。这将为您提供第一个首都的位置,忽略第一个角色。所以,如果C2是&#34; JohnSmith&#34;这将给你5,因为S在第5个位置,在单元格D2中。

现在您知道了姓氏的起始位置,您可以在E2中使用空格拼写全名:

=LEFT(C2,D2-1)&" "&RIGHT(C2,LEN(C2)-D2+1)

这取左边5-1 = 4个字符John,用空格连接,最后一个名字是9-5 + 1 = 5,因为9是整个名字的长度,即史密斯,所以你最终得到了约翰史密斯&#34;。