【问题标题】:MID + LEN function in Excel to extract letters + number with an inconsistent patternExcel 中的 MID + LEN 函数,用于提取模式不一致的字母 + 数字
【发布时间】:2017-11-20 17:11:35
【问题描述】:

我有一个包含客户信息的专栏。我只想从每个单元格中提取 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))

【问题讨论】:

  • 我无法说明如何在 Excel 中执行此操作,但如果您可以使用正则表达式,则可以匹配 [cC][sC](\d+)。不是答案,而是给 Google 一些东西。
  • @Vityata - 有什么建议吗?
  • 我们可以安全地说如果“CS”后面的数字是8个字符,最后一个字符是数字吗?如果“CS”后面的第 8 个数字是非数字,那么 CS 是 7 个字符?
  • @BruceWayne 是的,这是正确的。如果 CS 是 8 个数字,则第 8 个数字是数字。如果不是,CS 是 7 个数字

标签: excel function excel-formula


【解决方案1】:

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

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. 粘贴内容并关闭 VBE 窗口

如果您保存工作簿,UDF 将与它一起保存。 如果您使用的是 2003 年以后的 Excel 版本,则必须保存 文件为 .xlsm 而不是 .xlsx

要删除 UDF:

  1. 如上所示打开 VBE 窗口
  2. 清除代码
  3. 关闭 VBE 窗口

要使用 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

必须启用宏才能正常工作!

【讨论】:

    【解决方案2】:

    这是一个公式,它将从 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来确认kbd>

    seq 是*命名公式**

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

    如果您对用户定义函数 (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
    

    【讨论】:

      【解决方案3】:

      如果您对公式感兴趣,这应该可以:

      =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。

      【讨论】:

      • 如果在 A 中查看时没有返回任何内容,我如何添加一个子句以查看 B 列并运行相同的内容?
      • 有什么想法吗?我尝试在 IF 语句中嵌套,但没有运气。问题是,在少数情况下,CS 编号出现在 B 列中,所以我想运行您编写的相同函数,以防在 A 列中查看没有任何结果
      • =IF([formula above]="",[formula above, but swithc to col. b])`?
      • 我写了 =IF([formula above] = "#VALUE!", [formula above with B], [formula above] 但仍然没有得到它来产生 CS 编号。它必须说它等于“#VALUE!” - 我也尝试了“”,但无济于事
      • 如果有帮助,我可以将订单项示例发送给您。感谢您一直以来的帮助
      猜你喜欢
      • 2016-04-05
      • 1970-01-01
      • 1970-01-01
      • 2019-09-06
      • 1970-01-01
      • 2014-10-11
      • 2016-05-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多