在Excel中使用MID + LEN函数来提取带有不一致模式的字母+数字

我有一个有客户信息的专栏。 我想从每个单元中只提取CS号码。 下面是一些单元格的例子。

John Smith/CS41628644/555-555-5555 johnsmith,cs41923409,5555555555 John Smith - CS41821976 - 555-555-5555 Smith CS21893002 PN 5555555555 John Smith 555-555-5555 (CS17838618) 

正如你所看到的那样,它们并不遵循一致的模式,即CS#落入小区内的位置,或者它们之前或之后的位置。 为了使事情更复杂,有几个例子,其中数字是7位数字,而不是8(但绝大多数是8)。

这是我想要做的。 写一个函数说:“当'CS'(不区分大小写)被find,提取所有连续的整数,直到发现一个非整数,然后停止。

那有意义吗? 有一个更好的方法吗? 我目前的公式其实是缺less一些8位数字的CS号码,所以我的想法是我应该从头开始。 这是我刚才的更多的上下文。

 =LOOKUP(2,1/(MMULT(0+(ISNUMBER(-MID(" "&N252,ROW(INDIRECT("1:"&LEN(N252)))+{0,1,2,3,4,5,6,7,8,9},1))+0={0,1,1,1,1,1,1,1,1,0}),{1;1;1;1;1;1;1;1;1;1})=10),MID(N252,ROW( INDIRECT("1:"&LEN(N252))),8)) 

试试这个小的用户定义的function:

 Public Function GetCS(r As Range) As String Dim L As Long, v As String, L2 As Long, CH As String Dim i As Long GetCS = "" v = UCase(r.Text) L = InStr(1, v, "CS") L2 = Len(v) If L2 = 0 Or L = 0 Or L = L2 - 1 Then Exit Function For i = L + 2 To L2 CH = Mid(v, i, 1) If IsNumeric(CH) Then GetCS = GetCS & CH Else Exit Function End If Next i End Function 

在这里输入图像说明

用户定义的函数(UDF)非常易于安装和使用:

  1. ALT-F11调出VBE窗口
  2. ALT-I ALT-M打开一个新的模块
  3. 粘贴东西,closuresVBE窗口

如果保存工作簿,则UDF将随之保存。 如果您在2003年以后使用的是Excel版本,则必须将该文件另存为.xlsm而不是.xlsx

要删除UDF:

  1. 如上所示调出VBE窗口
  2. 清除代码
  3. closuresVBE窗口

从Excel中使用UDF:

= myfunction的(A1)

要了解有关macros的更多信息,请参阅:

http://www.mvps.org/dmcritchie/excel/getstarted.htm

http://msdn.microsoft.com/en-us/library/ee814735(v=office.14).aspx

有关UDF的具体信息,请参阅:

http://www.cpearson.com/excel/WritingFunctionsInVBA.aspx

macros必须启用这个工作!

这是一个公式,将返回列A或B的CS号码,或者如果没有任何内容,则返回一个错误值。 CS号码可以是任何长度。

 =IFERROR(MID(A1,SEARCH("cs",A1),MATCH(FALSE,ISNUMBER(-MID(A1,SEARCH("cs",A1)+2,seq)),0)+1),MID(B1,SEARCH("cs",B1),MATCH(FALSE,ISNUMBER(-MID(B1,SEARCH("cs",B1)+2,seq)),0)+1)) 

该公式是一个数组公式 ,必须通过按住Ctrl + Shift同时按Enter键来确认

seq是*命名公式**

 seq Refers To: =ROW(INDEX(Sheet1!$1:$65535,1,1):INDEX(Sheet1!$1:$65535,255,1)) 

在这里输入图像描述

如果您对用户定义函数(UDF)感兴趣,请使用下面的代码

  • 正则expression式来查找string中的第一个cs
  • 然后返回cs加上下面的所有数字
  • 它可以接受多个逗号分隔的参数,以便能够在第一个单元格为空的情况下检查第二个(或第三个)单元格。
  • 如果没有cs号码,它会返回一个错误信息,但是在代码中可以很容易地修改。

所以下面两个都是有效的:

 =CSNum(A1) =CSNum(A1,B1) 

常规模块

 Option Explicit Function CSNum(ParamArray S() As Variant) As Variant Dim RE As Object, MC As Object Dim V As Variant Set RE = CreateObject("vbscript.regexp") With RE .ignorecase = True .Pattern = "cs\d+" For Each V In S If .test(V) = True Then Set MC = .Execute(V) CSNum = MC(0) Exit Function End If Next V End With If CSNum = "" Then CSNum = CVErr(xlErrValue) End Function 

如果你对一个公式感兴趣,这应该是有效的:

 =IF(ISERR(NUMBERVALUE(MID(A1,SEARCH("CS",A1)+9,1))),MID(A1,SEARCH("CS",A1),9),MID(A1,SEARCH("CS",A1),10)) 

有点复杂,但基本上看它是否能将“CS”后的第9个字符变成数字。 如果不是,则返回“CS”+9个字符,否则返回“CS”+10。