我有一个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"。