我正在寻找一种方法来识别Excel单元格中的字符串中的日期戳,使用VBA,然后确定哪个最接近今天的日期。该单元格用于各种评论。
日期戳将始终如下所示:
dd.MM.YYYY or d.M.YYYY
在同一个单元格中可能会有这样的任意数量的邮票。
示例
假设单元格B5具有以下内容:
12.3.2015我做到了这一点。 20.11.2015完成更多事情。
我现在想要识别这两个日期戳,并找出今天与最新日期分开的天数。
我知道的最后一部分可以用DateDiff("d", y.Sheets("Sheet1").Range("B5").Value, Date)
之类的东西来整理,虽然这在这个例子中不起作用,因为单元格包含一个字符串。
有什么想法吗?
答案 0 :(得分:1)
使用正则表达式,它们是为这类事物而制作的。我不会详细介绍所有RegEx的工作原理,RegEx的基本要点是有一串字符,其中每个字符意味着你想要它执行的搜索。例如,假设查找包含1-12之间的一组数字的所有字符串,然后是a(选择日期分隔符),后跟一个或多个1和31之间的数字...... 等)
RegExLib.com通常有一些像这样的常见问题的解决方案。这是我们可以尝试的一个:http://regexlib.com/REDetails.aspx?regexp_id=932(但我们将删除前导^和尾随#):
([0]?[1-9]|[1][0-2])[./-]([0]?[1-9]|[1|2][0-9]|[3][0|1])[./-]([0-9]{4}|[0-9]{2})
使用分隔符验证美国日期格式:mm / dd / yyyy或m / d / yy或m.d.yyyy :. - /仅限有效日期! m(1-12)/ d(1-31)/ y(0 ..)
然后我们为它掀起一些VBA。我更喜欢后期绑定,所以我不需要为一个正则表达式检查添加一个参考:
Public Function GetDelimitedDatesInString(StringIn As String) As String
Dim ret As String
Dim matches As Object
Dim regex As Object
Dim pattern As String
Dim i As Integer, j As Integer
pattern = "([0]?[1-9]|[1][0-2])[./-]([0]?[1-9]|[1|2][0-9]|[3][0|1])[./-]([0-9]{4}|[0-9]{2})"
Set regex = CreateObject("VBScript.RegExp")
regex.pattern = pattern
regex.Global = True
Set matches = regex.Execute(StringIn)
For i = 0 To matches.Count - 1
ret = ret & ";" & matches(i).Value
Next i
If Len(ret) Then ret = Mid(ret, 2) 'trim leading delim
GetDelimitedDatesInString = ret
End Function
答案 1 :(得分:0)
Sub e(s As String)
Dim myarr() As String, mydate(50)
j = 0
datestr1 = "##.#.####*"
datestr2 = "##.##.####*"
For i = 1 To Len(s)
If Mid(s, i) Like datestr1 Or Mid(s, i) Like datestr2 Then
myarr = Split(Mid(s, i), ".")
dateday = myarr(0)
datemonth = myarr(1)
dateyear = Left(myarr(2), 4)
mydate(j) = DateSerial(dateyear, datemonth, dateday)
MsgBox mydate(j)
j = j + 1
End If
Next i
End Sub
这不是预期的输出,但可以让你前进,关键是如果字符串匹配你正在寻找你创建一个日期在前三个数组项目中的数组。