马蒂(Marty)在A列中有一个带有长零件号的工作表。这些内容由字母和数字组成,例如A123BC,AB123C等。Marty希望将数据分为三列,以便数字前的文本位于一列,数字位于第二列,而数字位于文本后。第三。

将零件号划分为多个段的复杂因素是,组合零件号的每个组件都没有设置长度。如果组件具有标准长度,则可以在Excel中使用“文本到列”功能。由于它们不是,并且组件之间没有分隔符,因此该解决方案的潜在途径已被关闭。

如果要使用公式将零件号分开,则将需要三个,每个要提取的组件一个。

假设零件号遵循指示的模式(文本,数字,文本),并且第一零件号在单元格A1中,则可以在单元格B1中使用以下内容:

=LEFT(A1,MATCH(FALSE,ISERROR(1*MID(A1,ROW(INDIRECT("1:100")),1)),0)-1)

这需要作为数组公式输入,这意味着您需要使用Ctrl + Shift + Enter进行输入。该公式在零件号中找到第一个数字,然后返回该数字之前的所有内容。

它适用于长度不超过100个字符的任何部件号。

要提取零件号的第二部分,可以在单元格C1中输入以下公式:

=MID(A1,MATCH(FALSE,ISERROR(1MID(A1,ROW(INDIRECT("1:100")), 1)),0),COUNT(1MID(A1,ROW(INDIRECT("1:100")),1)))

同样,这是一个公式,需要将其作为数组公式输入(Ctrl + Shift + Enter),以便它可以处理原始零件号中的每个字符。它检查零件号并确定数字的起点,然后提取所有这些数字。它返回一个文本字符串,即使该字符串由数字组成。如果希望将其实际视为一个数字(当然会除去所有前导零),则需要将整个公式包含在Value函数中,如下所示:

=VALUE(MID(A1,MATCH(FALSE,ISERROR(1MID(A1,ROW(INDIRECT("1:100")), 1)),0),COUNT(1MID(A1,ROW(INDIRECT("1:100")),1))))

要获取零件号的最后一个组成部分,您需要使用以下公式,并再次将其作为数组公式输入:

=MID(A1,MATCH(FALSE,ISERROR(1MID(A1,ROW(INDIRECT("1:100")), 1)),0)+COUNT(1MID(A1,ROW(INDIRECT("1:100")),1)),100)

尽管这种方法效果很好,但是众所周知,数组公式需要大量计算,尤其是当工作表中有很多公式时。如果您需要拆开一千个零件编号,则意味着您将获得3,000个数组公式,这在重新计算中可能非常非常慢。

如果您遇到这种情况,则可能需要使用宏来实际拆开零件号。如已经描述的,下面的宏应该对遵循文本,数字,文本模式的零件号起作用。

Sub Split1()

Dim C As Range     Dim sNew As New     Dim i As Integer          For Each C In Selection         sNew = ""

i = 1

' Get first part, which is text         Do While IsNumeric(Mid(C, i, 1)) = False             sNew = sNew & Mid(C, i, 1)



i = i + 1             If i > Len(C) Then Exit Do         Loop         C.Offset(0, 1).Value = sNew

' Pull next part, which should be digits         sNew = ""

Do While IsNumeric(Mid(C, i, 1)) = True             sNew = sNew & Mid(C, i, 1)



i = i + 1             If i > Len(C) Then Exit Do         Loop         C.Offset(0, 2).Value = sNew

' Use rest of original cell         sNew = Mid(C, i, Len(C))

C.Offset(0, 3).Value = sNew     Next C End Sub

要使用该宏,只需选择一个零件号并运行它。宏使用在单元格中的字符串中寻找数值/非数值之间的变化的概念。当达到这些边界之一时,将边界之前的原始字符串部分填充到新单元格中。可以像下面的示例中那样将这一概念缩短一些。

Sub Split2()

Dim C As Range     Dim j As Integer     Dim k As Integer

For Each C In Selection         j = 1         Do While Not (IsNumeric(Mid(C.Value, j, 1))) And j <= Len(C)

j = j + 1         Loop         k = j

Do While IsNumeric(Mid(C.Value, k, 1)) And k <= Len(C)

k = k + 1         Loop

C.Offset(0, 1) = Left(C, j - 1)

C.Offset(0, 2) = Mid(C, j, k - j)

C.Offset(0, 3) = Mid(C, k, Len(C) - (k - 1))

Next C End Sub

当然,此版本的宏与上一个版本的区别在于,该版本逐步遍历原始单元并立即确定边界。知道它们后,会将原始零件号的组件填充到单元格中。

拆开零件号的一种有趣方法是使用几个简短的用户定义函数,这些函数确定组件之间的边界。考虑以下两个函数:

Function pNumber(X)

i = 1     Do Until Mid(X, i, 1) Like "#": i = i + 1: Loop     pNumber = i End Function
Function pAlpha(X)

X = UCase(X)

i = pNumber(X)

Do Until Mid(X, i, 1) Like "[A-Z]": i = i + 1: Loop     pAlpha = i End Function

它们比以前的宏要短得多,它们所做的只是返回数字开头的边界(在pNumber的情况下)和第二组文本开头的边界(在pAlpha的情况下)。要使用这些功能,请使用以下三个公式分别返回原始零件号的第一,第二和第三部分:

=MID(A1,1,pNumber(A1)-1)

=MID(A1,pNumber(A1),pAlpha(A1)-pNumber(A1))

=MID(A1,pAlpha(A1),LEN(A1)-pAlpha(A1)+1)

注意:

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

链接:/ excelribbon-ExcelTipsMacros [点击此处在新的浏览器标签中打开该特殊页面]。

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

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

链接:/ excel-Breaking_Up_Variable-Length_Part_Numbers [打破可变长度零件号]。