如何从 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 只是使用相同的标准丢弃日期:
我是新手 - 尝试从串联的文本字符串中提取姓名和日期 - 每行都有一个带有月份的名称 - 所有内容都不同,每次搜索都必须更改月份。
[附件是我使用提取日期的 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 只是使用相同的标准丢弃日期: