在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)非常易于安装和使用:
- ALT-F11调出VBE窗口
- ALT-I ALT-M打开一个新的模块
- 粘贴东西,closuresVBE窗口
如果保存工作簿,则UDF将随之保存。 如果您在2003年以后使用的是Excel版本,则必须将该文件另存为.xlsm而不是.xlsx
要删除UDF:
- 如上所示调出VBE窗口
- 清除代码
- 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。