分解可变长度零件号(Microsoft Excel)
马蒂(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 [打破可变长度零件号]。