【发布时间】:2014-08-01 20:33:11
【问题描述】:
我有一个 Excel 表格,其中有一列名称,每个名称都以 firstname 大写和 lastname 大写开头。就像约翰史密斯一样
我想知道 excel 中是否有办法将 JohnSmith 转化为 John Smith 。请帮忙
谢谢
【问题讨论】:
-
我建议以here 为起点。人们已经使用了几种方法来完成您正在寻找的东西。
标签: excel-formula
我有一个 Excel 表格,其中有一列名称,每个名称都以 firstname 大写和 lastname 大写开头。就像约翰史密斯一样
我想知道 excel 中是否有办法将 JohnSmith 转化为 John Smith 。请帮忙
谢谢
【问题讨论】:
标签: excel-formula
最好的答案是使用 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 插件(见下文,它还有许多其他有用的功能)
更多功能插件
【讨论】:
从 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 在第 5 位,在单元格 D2 中。
现在您知道姓氏从哪里开始,您可以在 E2 中使用空格将全名拼凑在一起:
=LEFT(C2,D2-1)&" "&RIGHT(C2,LEN(C2)-D2+1)
这取左边的 5-1=4 个字符 John,用空格连接起来,右边的姓氏 9-5+1=5,因为 9 是全名的长度,即 Smith ,所以你最终得到了“John Smith”。
【讨论】: