【问题标题】:VBA: How can I keep only the date values from a string?VBA:如何只保留字符串中的日期值?
【发布时间】:2017-07-17 03:22:50
【问题描述】:

我有一个下面的字符串,想知道如何从中提取日期值并将它们存储在单独的单元格中。

11AUG2016更改gggqqq2i8yj 29SEP2016移除tyijdg298 30SEP2016添加,mkdjenb200 03OCT2016 zzxxddd4423 04OCT2016 jioi == ++ - 234jju 24OCT2016更新tuiomahdkj 10JAN2017更新ZZZZ T4123III 13JAN2017更新jukalzzz123 20JAN2017 iiiwwwaazz678uuh P>

【问题讨论】:

  • 使用VBA的Mid()函数。
  • @user7078484 是一长 String 吗?还是几个? (如保罗编辑)
  • 是一长串
  • 日期是否始终采用 DDMMMYYYY 格式?
  • 你应该使用正则表达式

标签: string vba excel date


【解决方案1】:

以下方法保留字符串格式 - 即日期写为字符串(它使用简单的正则表达式)。 假设:您的字符串写在单元格 A1 中。

Sub ExtractDateFromString()
    Dim s As String: s = Range("A1")
    Dim re As Object: Set re = CreateObject("VBScript.RegExp")
    re.Global = True
    re.Pattern = "(\d{2}[A-Z]{3}20\d{2}\s)"
    Set d = re.Execute(s)
    r = 2
    For Each x In d
        Range("A" & r) = x
        r = r + 1
    Next
End Sub

【讨论】:

    【解决方案2】:

    试试下面的代码。

    添加了一些错误处理,以防RegEx 将通过,但其中的值不是有效日期。

    Option Explicit
    
    Sub ExtractDates()
    
    Dim Reg1 As Object
    Dim RegMatches As Variant
    Dim Match As Variant
    Dim i As Long
    
    Dim dDay As Long
    Dim dYear As Long
    Dim dMon As String
    
    Set Reg1 = CreateObject("VBScript.RegExp")
    With Reg1
        .Global = True
        .IgnoreCase = True
        .Pattern = "(\d{2}[a-zA-Z]{3}\d{4})" ' Match any set of 2 digits 3 alpha and 4 digits
    End With
    
    Set RegMatches = Reg1.Execute(Range("A1").Value)
    
    i = 1
    If RegMatches.Count >= 1 Then
        For Each Match In RegMatches
            dDay = Left(Match, 2)
            dYear = Mid(Match, 6, 4)
            dMon = Mid(Match, 3, 3)
    
            On Error Resume Next
            If Not IsError(DateValue(dDay & "-" & dMon & "-" & dYear)) Then
                If Err.Number <> 0 Then
                Else
                    Range("B" & i).Value = (Match)
                    Range("C" & i).Value = DateValue(dDay & "-" & dMon & "-" & dYear) ' <-- have the date (as date format) in column C
                    i = i + 1
                End If
            End If
            On Error GoTo 0
        Next Match
    End If
    
    End Sub
    

    【讨论】:

      【解决方案3】:

      如果日期是唯一的“数字”,那么您可以使用SpecialCells()

      Sub main()
          Dim arr As Variant
      
          arr = Split("11AUG2016 Changed gggqqq2i8yj 29SEP2016 Removed tyijdg298 30SEP2016 Added ,mkdjenb200 03OCT2016 zzxxddd4423 04OCT2016 jioi==++-234jju 24OCT2016 Updated tuiomahdkj 10JAN2017 Updated zzzz T4123III 13JAN2017 Updated jukalzzz123 20JAN2017 iiiwwwaazz678uuh", " ")
          With Range("A1").Resize(UBound(arr) + 1)
              .Value = Application.Transpose(arr)
              .SpecialCells(xlCellTypeConstants, xlTextValues).Delete xlUp
          End With
      End Sub
      

      如果字符串在单元格“A1”中,代码​​变为:

      Sub main()
          Dim arr As Variant
      
          With Range("A1")
              arr = Split(.Value, " ")
              With .Resize(UBound(arr) + 1)
                  .Value = Application.Transpose(arr)
                  .SpecialCells(xlCellTypeConstants, xlTextValues).Delete xlUp
              End With
          End With
      End Sub
      

      【讨论】:

        【解决方案4】:

        使用 A1 中的数据尝试:

        Sub marine()
            Dim s As String, r As Range
            s = Range("A1").Value
            ary = Split(s, " ")
            i = 2
            For Each a In ary
                    Cells(i, 1).Value = a
                    If IsDate(Cells(i, 1).Value) Then
                        i = i + 1
                    End If
            Next a
        
            Set r = Cells(Rows.Count, 1).End(xlUp)
            If IsDate(r.Value) Then Exit Sub
            r.Clear
        End Sub
        

        该技术将候选人放在一个单元格中,然后测试它是否是一个日期。如果是日期,则保留,否则覆盖。

        【讨论】:

        • 您应该补充一点,这仅在日期被空格“包围”时才有效。
        • 是的,理解,但问题是如果数据总是这样,OP 需要回答哪个
        • 谢谢,Gary 的学生!!
        • @Storax,是的,日期用空格括起来。
        猜你喜欢
        • 1970-01-01
        • 2018-07-30
        • 1970-01-01
        • 2016-03-16
        • 2015-09-14
        • 2011-12-04
        • 1970-01-01
        • 2023-02-23
        相关资源
        最近更新 更多