如何从 excel 宏中的连接字符串中提取数据

How to extract data from a concatenated string in excel macro

我是新手 - 尝试从串联的文本字符串中提取姓名和日期 - 每行都有一个带有月份的名称 - 所有内容都不同,每次搜索都必须更改月份。
[附件是我使用提取日期的 MID 结果的屏幕截图][1]

我曾尝试使用逗号左侧的第一个大写字母进行 MID 和 RIGHT,但没有成功。 任何帮助将不胜感激。

我有一个处理数据的脚本 - 以下是提取姓名和日期的 VBA 代码: 姓名 ActiveCell.Formula = "=IFERROR(MID(C3,1,FIND(""January"",C3,1)-1),IFERROR(MID(C3,1,FIND(""February" ",C3,1)-1),IFERROR(MID(C3,1,FIND(""March"",C3,1)-1),IFERROR(MID(C3,1,FIND(""April"",C3,1)-1),IFERROR(MID(C3,1,FIND(""May"",C3,1)-1),IFERROR(MID(C3,1,FIND(""June"",C3,1)-1),IFERROR(MID(C3,1,FIND(""July"",C3,1)-1),IFERROR(MID(C3,1,FIND( ""August"",C3,1)-1),IFERROR(MID(C3,1,FIND(""September"",C3,1)-1),IFERROR(MID(C3,1, FIND(""October"",C3,1)-1),IFERROR(MID(C3,1,FIND(""November"",C3,1)-1),IFERROR(MID(C3, 1,FIND(""December"",C3,1)-1),""No matches""))))))))))"

日期 ActiveCell.Formula = "=IFERROR(MID(C3,FIND(""January"",C3)*1,20),IFERROR(MID(C3,FIND(""February"",C3) *1,20),IFERROR(MID(C3,FIND(""March"",C3)*1,20),IFERROR(MID(C3,FIND(""April"",C3)*1 ,20),IFERROR(MID(C3,FIND(""May"",C3)*1,20),IFERROR(MID(C3,FIND(""June"",C3)*1,20 ),IFERROR(MID(C3,FIND(""July"",C3)*1,20),IFERROR(MID(C3,FIND(""August"",C3)*1,20), IFERROR(MID(C3,FIND(""September"",C3)*1,20),IFERROR(MID(C3,FIND(""October"",C3)*1,20),IFERROR( MID(C3,FIND(""November"",C3)*1,20),IFERROR(MID(C3,FIND(""December"",C3)*1,20),""nope""))))))))))""=12=]

我敢肯定有更简单的方法 - 我只是还没想出来,我迫于压力要把这些数据拿出来 -

![1]: https://i.stack.imgur.com/dT92Q.jpg

这里有两个用户定义的函数:

Public Function DateGrabber(s As String) As Date
    Dim temp As String, temp2 As String, i As Long, L As Long
    temp = s
    temp2 = ""
    L = Len(s)
    For i = L To 1 Step -1
        temp2 = Mid(temp, i, 1) & temp2

        If Mid(temp, i, 1) Like "[A-Z]" Then
            DateGrabber = CDate(temp2)
            Exit Function
        End If
    Next i
End Function


Public Function DateDiscarder(s As String) As String
    Dim i As Long, L As Long
    L = Len(s)
    For i = L To 1 Step -1
        If Mid(s, i, 1) Like "[A-Z]" Then
            DateDiscarder = Left(s, i - 1)
            Exit Function
        End If
    Next i
End Function

第一个函数从字符串末尾向后查找,直到找到 第一个大写字母。这就是它找到日期部分的方式。

第二个 UDF 只是使用相同的标准丢弃日期: