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



我有一个Excel表格,其中有一列名字,每个名字都以首字母大写和姓大写开头。约翰·史密斯

我想知道是否有办法在excel中把JohnSmith变成JohnSmith。请帮忙

谢谢

最好的答案是在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

不是我的原始代码,从其他地方复制,更改了几个变量以支持显式声明变量

正如已经建议的,您可以使用@Derrik链接的线程中列出的多个公式,但我觉得它们看起来又长又笨重。我个人最喜欢的是:

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

这需要Morefunc插件(见下文,它也有许多其他有用的函数)


MOREFUNC插件

  • 这是我找到的最后一个可用的下载链接
  • 这里有一个很好的安装演练视频

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

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

虽然我修改它从第二个字符开始。这将为您提供第一个大写字母的位置,忽略第一个字符。因此,如果C2是"JohnSmith",这将给您5,因为S在单元格D2中的第5个位置。

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

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

取左边的5-1=4个字符John,用一个空格将其连接起来,然后取右边的姓氏9-5+1=5,因为9是整个名字的长度,也就是Smith,所以你最终得到"John Smith"。