Manik有一个工作表,该工作表的A列中的文本值格式为“ mikeDAVIS”,该人的名字用小写字母,姓氏用大写字母。根据文本的情况,他希望将名称分为两个单独的列。

这可以使用公式或宏来完成。不管使用哪种方法,关键都是要弄清楚文本从小写变为大写的位置。这只能通过检查字符串中的每个字符来完成。因此,如果要使用公式化方法,则需要使用数组公式。以下数组公式返回单元格A1中任何内容的姓氏:

=MID(A1,MATCH(1,(CODE(MID(A1,ROW($1:$255),1))>=65)

* (CODE(MID(A1,ROW($2:$255),1))<90),)+1,255)

请记住,由于这是一个数组公式,因此应按Ctrl + Shift + Enter进行输入。它返回找到的第一个大写字母开头的单元格中的所有内容。因此,在“ mikeDAVIS”中将返回“ DAVIS”,在“ mikeDavis”中将返回“ Davis”。假设您在单元格B1中使用了数组公式,则可以使用以下方法确定名字:

=SUBSTITUTE(A1,B1,"")

这是一个常规公式,而不是数组公式。

有许多相似的数组公式可以完成很多相同的任务。例如,此数组公式将返回单元格A1中任何内容的名字(所有字符直到第一个大写字符):

=LEFT(A1,MAX((CODE(MID(A$1,ROW(INDIRECT("1:"& LEN(A1))),1))>96)*ROW(INDIRECT("1:"&LEN(A1)))))

然后,您可以使用相同的常规公式(使用SUBSTITUTE函数的公式)来得出姓氏。

如果要使用宏方法来查找名称,您所要做的就是提供一个公式,该公式将返回文本中第一个大写字母的位置。以下代码在文本中返回此“更改点”:

Function GetFirstUpper(MyCell As Range) As Integer     Dim sCellValue As String     Dim i As Integer

sCellValue = Trim(MyCell.Value)

i = 1     Do While (Asc(Mid(sCellValue, i, 1)) > 90 _       Or Asc(Mid(sCellValue, i, 1)) < 65) _       And i < Len(sCellValue) + 1         i = i + 1     Loop     If i > Len(sCellValue) Then         GetFirstUpper = 99     Else         GetFirstUpper = i     End If End Function

要使用该功能,我们假设名称在单元格A1中。您可以在工作表中使用以下公式找到名字和姓氏:

=LEFT(A1,GetFirstUpper(A1)-1)

=MID(A1,GetFirstUpper(A1),LEN(TRIM(A1))-GetFirstUpper(A1)+1)

如果您希望宏返回实际名称,则可以使用下面的宏来返回第一个大写字母之前的所有内容:

Function GetFirstName(MyCell As Range) As String     Dim sCellValue As String     Dim i As Integer

sCellValue = Trim(MyCell.Value)

i = 1     Do While (Asc(Mid(sCellValue, i, 1)) > 90 _       Or Asc(Mid(sCellValue, i, 1)) < 65) _       And i < Len(sCellValue) + 1         i = i + 1     Loop     If i > Len(sCellValue) Then         GetFirstName = sCellValue     Else         GetFirstName = Left(sCellValue, i - 1)

End If End Function

要使用该宏,您需要做的就是在工作表单元格中使用以下内容。 (这假定要评估的文本字符串在单元格A1中。)

=GetFirstName(A1)

宏上的微小变化将使您能够类似地获取姓氏,假定姓氏是从遇到的第一个大写字母开始的所有内容。

Function GetLastName(MyCell As Range) As String     Dim sCellValue As String     Dim i As Integer

sCellValue = Trim(MyCell.Value)

i = 1     Do While (Asc(Mid(sCellValue, i, 1)) > 90 _       Or Asc(Mid(sCellValue, i, 1)) < 65) _       And i < Len(sCellValue) + 1         i = i + 1     Loop     If i > Len(sCellValue) Then         GetLastName = sCellValue     Else         GetLastName = Mid(sCellValue, i)

End If End Function

如果愿意,可以将宏组合为一个函数,该函数将根据您指定的内容返回名字或姓氏:

Function GetName(MyCell As Range, sWanted As String) As String     Dim sCellValue As String     Dim i As Integer

sCellValue = Trim(MyCell.Value)

i = 1     Do While (Asc(Mid(sCellValue, i, 1)) > 90 _       Or Asc(Mid(sCellValue, i, 1)) < 65) _       And i < Len(sCellValue) + 1         i = i + 1     Loop     If i > Len(sCellValue) Then         GetName = sCellValue     Else         If LCase(sWanted) = "first" Then             GetName = Left(sCellValue, i - 1)

Else             GetName = Mid(sCellValue, i)

End If     End If End Function

要使用此组合功能,您只需指定所需的名称:

=GetName(A1, "First")

以这种方式作为参数传递的单词“ First”将返回名字(第一个大写字母之前的所有内容)。作为第二个参数传递的任何其他字符串(例如“ Last”或“ xxx”或“ Rest”或什至“”)都将返回姓氏。

注意:

如果您想知道如何使用此页面(或_ExcelTips_网站上的任何其他页面)中描述的宏,我准备了一个特殊页面,其中包含有用的信息。

_ExcelTips_是您进行经济高效的Microsoft Excel培训的来源。

本技巧(9091)适用于Microsoft Excel 2007、2010、2013、2016、2019和Office 365中的Excel。您可以在此处为Excel的较旧菜单界面找到此技巧的版本: