Excel中的MID + LEN函数用不一致的模式提取字母+数字

时间:2017-11-20 17:11:35

标签: excel function excel-formula

我有一个列有客户信息的专栏。我想从每个单元格中提取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'(不区分大小写)时,提取所有后续的连续整数,直到找到非整数,然后停止。”

这有意义吗?有一个更好的方法吗?我目前的公式实际上缺少了一些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))

3 个答案:

答案 0 :(得分:3)

尝试这个小的用户定义函数:

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

enter image description here

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

  1. ALT-F11调出VBE窗口
  2. ALT-I ALT-M打开了一个新模块
  3. 粘贴内容并关闭VBE窗口
  4. 如果保存工作簿,UDF将随之保存。 如果您在2003年之后使用的是Excel版本,则必须保存 该文件为.xlsm而不是.xlsx

    删除UDF:

    1. 按上述方式调出VBE窗口
    2. 清除代码
    3. 关闭VBE窗口
    4. 从Excel使用UDF:

      = myfunction的(A1)

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

      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

      必须启用宏才能使其生效!

答案 1 :(得分:1)

这是一个公式,它将从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 确认,同时按输入

seq是*命名公式**

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

enter image description here

如果您对用户定义函数(UDF)感兴趣,可以使用

  • 正则表达式,用于查找字符串中的第一个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

答案 2 :(得分:0)

如果您对公式感兴趣,这应该有效:

             pinid t0_t1 t0_t2 t1_t2
    1 CP_South_1_1     -2    -5     -3
    2 CP_South_1_2     -1     5     -4

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