首页 > 解决方案 > VBA - 从自由格式文本字符串中解析日期

问题描述

我正在尝试从填充有自由格式文本字符串的单元格中解析出干净的目标日期。

即:文本字符串:“ETA:11/22(春季 4.5)”或“ETA 10/30/2019 EOD”

如您所见,日期在字符串中的位置没有明确的标准,这使得 LEFT 或 RIGHT 公式无效。

我尝试利用我发现的 VBA 函数,它基本上根据字符串中的空格将字符串分解为多个部分;但是它一直没有工作。

Public Function GetDate(ResNotes As String) As Date

    Dim TarDate As Variant
    Dim part As Variant

    TarDate = Split(ResNotes, " ")

    For Each part In ResNotes
        If IsDate(part) = True Then
           GetDate = part
           Exit Function
        End If
    Next

    GetDate = "1/1/2001"
End Function

我将带有文本字符串的单元格称为“ResNotes”,是“Resolution Notes”的缩写,它是列的标题

“TarDate”是指我试图解析的“目标日期”

Excel 中自定义 GETDATE 函数的结果给了我一个#NAME?错误。

我希望结果会给我一些类似于“2019 年 10 月 30 日”的内容

标签: excelvba

解决方案


如果您正在获取,#NAME则代码不会存储在通用模块中。它不应位于工作表模块或 ThisWorkbook 模块中。

代码中的错误也很少。拆分返回一个String数组。TRUE/FALSE并且由于IsDate 返回= True不需要。

根据@MathieuGuindon,如果找到,我们可以将字符串更改为代码中的日期,否则返回错误。为此,我们需要允许 return 是一个变体。

Public Function GetDate(ResNotes As String)

    Dim TarDate() As String
    Dim part As Variant

    TarDate = Split(ResNotes, " ")

    For Each part In TarDate
        If IsDate(part) Then
           GetDate = CDate(part)
           Exit Function
        End If
    Next

    GetDate = "1/1/2001"
    'Instead of a hard coded date, one can return an error, just use the next line instead
    'GetDate =CVErr(xlErrValue)
End Function

推荐阅读