将不规则文本中的子字符串提取到 Excel 单元格

Mad*_*ddy 0 excel vba excel-formula

我在 Excel 的单列中有这样的文本

@22-atr$$1 AM**01-May-2015&&
$21-atr@10-Jan-2007*6 PM&
&&56-atr@11 PM$$8-Jan-2016*
**4 PM#68-atr@21-Mar-2022&&
Run Code Online (Sandbox Code Playgroud)

我想编写具有单独列的函数,如下所示:
在此输入图像描述

我能够使用提取月份=MID(A1,FIND("-",A1)+1,3)

Jvd*_*vdV 5

公式的一种选择是使用新函数,目前可在 BETA 通道中供内部人员使用:

在此输入图像描述

公式为B1

=LET(A,TEXTSPLIT(A1,{"@","$","&","*","#"},,1),B,SORTBY(A,IFERROR(MATCH(RIGHT(A),{"r","M"},0),3)),C,HSTACK(TAKE(B,,2),TEXTSPLIT(TEXT(--INDEX(B,3),"YYYY-Mmm-D"),"-")),IFERROR(--C,C))
Run Code Online (Sandbox Code Playgroud)

这个想法是:

  • 使用LET()through来存储变量;
  • TEXTSPLIT()A 列中的值使用所有可用分隔符进入列并跳过结果数组中的空值;
  • 然后SORTBY()使用 得到的三个元素的最右边的字符MATCH()。将IFERROR()捕获数据字符串;
  • 我们可以将HSTACK()第一列和第二列与格式化为第一个元素后分割第三个元素的结果进行比较YYYY-MMM-D
  • 最后,得到的数组可以乘以双一元。如果没有,我们将其替换为前一个变量的原始内容。

注意事项

  • 我格式化了 C 列以保存 AM/PM 的时间值。
  • 我将文本更改为包含荷兰语月份名称,以便 Excel 识别日期以进行演示。应该与英文名称相同。

为了好玩,使用正则表达式的 UDF:

Public Function GetPart(inp As String, prt As Long) As Variant
    
    Dim Pat As String
    
    Select Case prt
        Case 0
            Pat = "(\d+-atr)"
        Case 1
            Pat = "(\d+\s*[AP]M)"
        Case 2
            Pat = "-(\d{4})"
        Case 3
            Pat = "-(\w+)-"
        Case 4
            Pat = "(\d+)-\w+-"
        Case Else
            Pat = ""
    End Select
        
    With CreateObject("vbscript.regexp")
        .Pattern = ".*" & Pat & ".*"
        GetPart = .Replace(inp, "$1")
    End With
        
End Function
Run Code Online (Sandbox Code Playgroud)

通过 调用=GetPart(0,A1)。选项为 0-4,并按列标题的顺序排列。