VBA - 在包含格式 'DDMMYYYY' 的文本中查找日期

VBA - Find date within text containing format 'DDMMYYYY'

我已经扫描并找到了许多与我的问题类似的答案,尽管其中 none 非常符合要求,所以我将解释我所追求的,希望它是有意义的:

例如,这是不正确的代码,我确信它需要一些认真的调整!

    Cells.Replace What:="Dates", Replacement:="Dates-1", LookAt:=xlPart,    _
    SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=DDMMYYYY, _
    ReplaceFormat:=False 

我收集到在上面的代码可以工作之前需要先执行一些定义,但是如果有人可以提供帮助,我将不胜感激!

非常感谢,

罗宾。

我认为任何调整都不会让您的代码达到您想要的效果。我不能给出明确的答案,因为我不太相信你的描述。我希望以下信息能让您调查您的数据并制定适当的解决方案。

据我所知,您没有正确使用 SearchFormat。你需要这样的东西:

With Application.FindFormat
  .Font.Bold = True
End With

Set Rng = .Find(. . .  SearchFormat = True  . . .)

VBA Find 的编辑帮助指出:“SearchFormat 可选 Variant 。搜索格式。”但没有举例说明这意味着什么。我找不到使用非上述样式的查找格式工具的示例。即:您使用 FindFormat 指定感兴趣的格式,并将 SearchFormat 设置为 True 以指示要搜索这些格式。

你可以试试:

With Application.FindFormat
  .NumberFormat = "DDMMYYYY"
End With

我没有尝试过,也找不到任何说明可以搜索哪些格式类型的文档。如果这可行,几乎肯定会比基于以下信息的任何方法都更快、更容易。

要Excel将文本文件中的字符串作为日期导入,必须:

  • 将字符串识别为日期。
  • 将该字符串转换为数字。
  • 使用表明它是日期的数字格式存储该数字。

Excel 将日期存储为自 1/1/1900 以来的天数。例如,“21 August 2015”将存储为 42238,数字格式为“dd mmmm yyyy”。单元格值没有任何内容表明这是一个日期。您可以将单元格值输入为 42238,然后将数字格式设置为“dd mmm yy”,该值将显示为“21 Aug 15”。

您的描述暗示日期在文本文件中保存为八位值,Excel 将其识别为日期,因此将数字格式设置为 "DDMMYYYY"。我从未设法让 Excel 将八位数的值识别为日期。如果你成功了,我想知道怎么做。

我最好的建议是:

For Each CellCrnt in RngImport
  If CellCrnt.NumberFormat = "ddmmyyy" Then
    ' Add year to date
  End If
Next

分机

如果您执行我在针对您的问题的评论中要求的操作,我们应该能够识别您希望查找和修改的值的类型。此扩展说明了您可以如何使用该信息。

在我之前的代码中,我使用 RngImport 来表示导入数据的范围。你的一句话让我想知道:你知道如何初始化那个范围吗?

我们是否必须在整个范围内搜索这些“日期”?也就是说,数据是分散的还是仅限于单个列?如果我们不必检查每个单元格,最终代码会更快。

我猜我们需要这样的东西:

If IsDate(Mid(CellValue,1,2) & "/" & Mid(CellValue,3,2) & "/" & Mid(CellValue,5,4)) Then

将“ddmmyyyy”转换为“dd/mm/yyyy”,然后测试新字符串是否为日期。

这是我的建议:

Sub OneYearEarlier()
    Dim c As Range
    Dim dt As Date

    For Each c In Selection
        If c.NumberFormatLocal = "TT.MM.JJJJ" Then
            dt = DateAdd("yyyy", -1, c.Value)
            c.Value = dt
        End If
    Next c
End Sub

首先,我认为您必须将单元格值作为日期数据类型来处理,而不是字符串。这将避免溢出或下溢,如果不减少一年但其他时间间隔可能会发生溢出或下溢,例如一个月。
其次,正如其他人所提到的,您无法可靠地检测到数字是 XL 中的日期。我的代码使用
- 仅您事先选择的单元格(例如一列)
- 只有日期格式为

的单元格

我在这里使用 NumberFormatLocal 以便格式字符串与您在格式对话框中看到的相同/"custom format"。但这在这里并不重要,只是为了方便。

我真的不喜欢同时使用 'internal' 格式字符串 "yyyy" 和本地化格式字符串 "JJJJ",但这正是 DateAdd 想要的方式。

您始终可以创建自己的 RegEx 函数来简化:

    Function RegEx(Target As String, RegExpression As String, _
                   Optional ReplaceString As String, Optional xIgnoreCase As Boolean, _
                   Optional xGlobal As Boolean, Optional xMultiLine As Boolean)
    
        Dim regexOne As Object
                
        Set regexOne = New RegExp
        regexOne.Pattern = RegExpression
        If xIgnoreCase Then regexOne.IgnoreCase = xIgnoreCase
        If xGlobal Then regexOne.Global = xGlobal
        If xMultiLine Then regexOne.MultiLine = xMultiLine
        
        If regexOne.Test(Target) Then
            If IsMissing(ReplaceString) Then
                RegEx = regexOne.Execute(Target)
            Else
                RegEx = regexOne.Replace(Target, ReplaceString)
            End If
        End If
            
    End Function