识别在字符串中随机放置的日期

时间:2015-11-27 09:13:20

标签: vba excel-vba excel

我正在寻找一种方法来识别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)之类的东西来整理,虽然这在这个例子中不起作用,因为单元格包含一个字符串。

有什么想法吗?

2 个答案:

答案 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

这不是预期的输出,但可以让你前进,关键是如果字符串匹配你正在寻找你创建一个日期在前三个数组项目中的数组。