有没有办法解释从任何字符串的任何日期?

问题描述 投票:-1回答:3

我有日期的各种格式,在字符串中,所有ColumnA。这里是一个小例子。

-rw-r--r--   35 30067    10224     <-- 2018-09
-rw-r--r--   36 30067    10224     <-- 2018-09
-rw-r--r--   65 30067    10224     <-- 2018-10-24
excel vba excel-vba
3个回答
2
投票

我试图让最新与正则表达式。据我看到的,日期是无论是在字符串的结束或有后一个点(后跟扩展名)。正则表达式考虑到一年的长度:4或2。此外,它管理的时候一个月文字表达的情况。重要!当这一天是不存在的,我把它设置为第一天。

Function GetDate(strString$)
    Dim sYear$, sMonth$, sDay$
    With CreateObject("VBScript.RegExp")
        .IgnoreCase = True: .Pattern = "(\d{2})([a-z]{3}|\d{2})(\d{2})?(?=\.|$)"
        With .Execute(strString)
            If .Count > 0 Then
                With .Item(0)
                    sYear = .SubMatches(0)
                    sMonth = .SubMatches(1)
                    sDay = .SubMatches(2)
                    sYear = "20" & sYear
                    If Not IsNumeric(sMonth) Then
                        sMonth = GetMonthIndex(sMonth)
                    End If
                    If Len(sDay) = 0 Then sDay = "01"
                    GetDate = DateSerial(CInt(sYear), CInt(sMonth), CInt(sDay))
                End With
            End If
        End With
    End With
End Function

Private Function GetMonthIndex$(strMonth$)
    Select Case strMonth
        Case "Jan": GetMonthIndex = "01"
        Case "Feb": GetMonthIndex = "02"
        Case "Mar": GetMonthIndex = "03"
        Case "Apr": GetMonthIndex = "04"
        Case "May": GetMonthIndex = "05"
        Case "Jun": GetMonthIndex = "06"
        Case "Jul": GetMonthIndex = "07"
        Case "Aug": GetMonthIndex = "08"
        Case "Sep": GetMonthIndex = "09"
        Case "Nov": GetMonthIndex = "10"
        Case "Oct": GetMonthIndex = "11"
        Case "Dec": GetMonthIndex = "12"
    End Select
End Function

1
投票

尝试

Sub test()
    Dim rngDB As Range
    Dim vDB As Variant, vR() As Variant
    Dim vS As Variant
    Dim i As Long, j As Integer, c As Integer
    Dim s As String

    Set rngDB = Range("a1", Range("a" & Rows.Count).End(xlUp))
    vDB = rngDB

    r = UBound(vDB, 1)
    ReDim vR(1 To r, 1 To 1)

    For i = 1 To r
        s = vDB(i, 1)
        vS = Split(s, ".")
        If IsNumeric(vS(1)) Then
            s = vS(1)
            s = Right(s, 6)
            s = Left(s, 2) & " " & Mid(s, 3, 2) & " " & Right(s, 2)
            vR(i, 1) = DateValue(s)
        Else
            s = vS(0)
            s = Right(s, 6)
            If IsNumeric(s) Then
                s = Left(s, 2) & " " & Mid(s, 3, 2) & " " & Right(s, 2)
                vR(i, 1) = DateValue(s)
            Else
                s = Right(s, 4)
                If IsNumeric(s) Then
                    s = Left(s, 2) & " " & Mid(s, 3, 2) & " " & 1
                    vR(i, 1) = DateValue(s)
                Else
                    s = vS(0)
                    s = Right(s, 7)
                    s = Left(s, 2) & " " & Mid(s, 3, 3) & " " & Right(s, 2)
                    vR(i, 1) = DateValue(s)
                End If
            End If
        End If
    Next i
    Range("b1").Resize(r) = vR

End Sub

0
投票

在没有任何固定的模式将是复杂的。你的情况在逻辑的方式更好的方法将通过最新的图案像文件关联

  • 1 => * .BUS - > YYMM
  • 2 => *和面 - > YYMMDD
  • 3 => TTN * - > YYYYMMDD

而在相同的逻辑得到的映射表,在文件名日期字符串的位置

  • 文件名的1 =>最后4个字符
  • 文件名2 =>最后6个字符
  • 3 =>扩展

在微距功能或开关功能。

© www.soinside.com 2019 - 2024. All rights reserved.