Dan有一个单元格列,每个单元格包含三个项目:城市,州和邮政编码。 (所有三个都在一个单元格中,就像您在地址行中看到的一样。)某些邮政编码是5位数字,有些是9位。 Dan需要在当前数据的右侧,将两个字符的状态和五个数字的邮政编码分别放入自己的单元格中。 Dan知道他可以使用“文本到列”工具,但是他认为这涉及很多工作,因为他需要处理多个单词的城市名称和逗号。丹忍不住想,也许有一种公式化的方法会更容易。

为了提出任何建议,需要对数据进行一些假设。例如,假设所有数据都采用以下格式:

My Town, CA 98765-4321

从短划线开始的部分(邮政编码的结尾部分)是可选的,但逗号的位置是静态的(始终跟随镇名),并且州始终由两个字符组成。在这种情况下,可以很容易地设计出两个提取状态缩写的公式和邮政编码的前五个数字:

=MID(A1,FIND(",",A1)+2,2)

=MID(A1,FIND(",",A1)+5,5)

这两个公式都以逗号开头;它充当城市与真正想要的两个项目之间的分隔符。如果数据中没有逗号或有多个逗号,则公式将不会返回所需的信息。

这些公式还假定您的数据中没有多余的空格;逗号后以及州与邮编之间最多只有一个空格。当然,这很容易执行-只需使用“查找和替换”将两个空格替换为工作表中任何位置的一个空格即可。

当然,如果您的数据是这种结构化的,您仍然可以依靠“文本转换为列”工具来进行工作。您所需要做的就是运行该工具,并根据逗号分割数据。这会将城市留在一个单元格中,然后将州和邮政编码放在下一个单元格中。然后,您可以再次在第二个单元格(不是城市名称)上使用“文本到列”,然后根据空间对内容进行划分。

如果您的数据不是那么结构化的(也许它的地址中有多个逗号或多余的空格),那么就需要一种完全不同的方法。为了解决这个问题,基本技术包括修剪数据以除去多余的空间(前导,尾随和内部),然后确定最后一个空间和倒数第二个空间的位置。

您可以使用以下公式来提取邮政编码中的五个数字,该数字被定义为紧靠数据的最后一个空格:

=MID(TRIM(A1),FIND(CHAR(1),SUBSTITUTE(TRIM(A1)," ", CHAR(1),LEN(TRIM(A1))-LEN(SUBSTITUTE(TRIM(A1)," ",""))))+1,5)

可以通过倒数第二个空格紧跟两个字符来返回两个字符状态的缩写:

=MID(TRIM(A1),FIND(CHAR(1),SUBSTITUTE(TRIM(A1)," ",CHAR(1), LEN(TRIM(A1))-LEN(SUBSTITUTE(TRIM(A1)," ",""))-1))+1,2)

如果您的数据结构更松散-也许它包含的地址都不全是两个字符的状态缩写(用N.J.代替NJ),那么最好使用宏来划分数据。

原因是VBA具有比使用Excel公式更丰富的文本处理功能集。以下宏创建了一个用户定义的函数,该函数可以返回状态或邮政编码:

Function GetStateZIP(rstrAddress As String, iAction As Integer) As String     Dim arr As Variant     Dim sState As String     Dim sZIP As String     Dim J As Integer     Dim K As Integer

Application.Volatile     rstrAddress = Trim(rstrAddress)

If Len(rstrAddress) = 0 Then Exit Function

sState = "?"

sZIP = "?"

For J = Len(rstrAddress) To 1 Step -1         If Mid(rstrAddress, J, 1) = " " And sZIP = "?" Then             sZIP = Mid(rstrAddress, J + 1, 5)

rstrAddress = Trim(Left(rstrAddress, J))

For K = Len(rstrAddress) To 1 Step -1                 If Mid(rstrAddress, K, 1) = " " And sState = "?" Then                     sState = Mid(rstrAddress, K + 1, 20)

rstrAddress = Trim(Left(rstrAddress, K))

End If             Next K         End If     Next J     If iAction = 1 Then         GetStateZIP = sState     End If     If iAction = 2 Then         GetStateZIP = sZIP     End If End Function

要使用此功能,只需提供一个单元格引用,然后提供1(如果需要状态)或2(如果需要邮政编码)。这是为单元格A1中的任何地址请求邮政编码的示例:

=GetStateZIP(A1,2)

注意:

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

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

本技巧(9598)适用于Microsoft Excel 97、2000、2002和2003。可以在以下功能区中为Excel的功能区界面(Excel 2007及更高版本)找到本技巧的版本: