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



我已经扫描并发现了许多类似的答案,尽管他们都不太符合要求,所以我将解释我所追求的,希望它是有意义的:

  • 我已经将数据从TXT导入到excel电子表格(2007年工作),其中包含各种日期(所有格式为DDMMYYYY)。
  • 我要做的是创建一个子例程,该子例程以这种格式查找任何日期,然后将日期减少1年。
  • 当TXT导入时,日期在一个范围内(在本例中,前2个日期出现在范围A6下),所以理想情况下,我希望指定该范围,因为我不一定要减少TXT中存在的所有日期。

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

    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  . . .)

Find的VBA编辑器帮助状态:" SearchFormat可选Variant。搜索格式。,但没有给出任何例子来说明这是什么意思。我找不到一个使用查找格式工具的示例,它不是上述样式的。也就是说:您使用FindFormat来指定感兴趣的格式,并将SearchFormat设置为True来表示要搜索这些格式。

你可以试试:

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

我没有尝试过这个,我找不到任何文档,解释什么格式类型可以搜索。如果这样做有效,几乎可以肯定,它将比基于以下信息的任何操作都更快、更容易。

要使Excel在文本文件中导入字符串作为日期,它必须:

  • 将字符串识别为日期。
  • 将该字符串转换为数字
  • 用数字格式存储该数字,表示该数字是日期。

Excel将日期存储为自1900年1月1日以来的天数。例如,"21 August 2015"将被存储为42238,其数字格式为"dd mmm yyyy"。单元格值中没有任何内容表明它是日期。您可以输入单元格值为42238,然后将数字格式设置为"dd mmm yy",该值将显示为"21 Aug 15"。

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

我最好的建议是:

For Each CellCrnt in RngImport
  If CellCrnt.NumberFormat = "ddmmyyy" Then
    ' Add year to date
  End If
Next
<<p> 扩展/strong>

如果您执行了我在针对您的问题的评论中要求的操作,我们应该能够识别您希望定位和修改的值的类型。这个扩展解释了如何使用这些信息。

在前面的代码中,我使用RngImport来表示导入数据的范围。你的一个评论让我很好奇:你知道如何初始化Range吗?

我们必须在整个范围内搜索这些"日期"吗?也就是说,它们是分散在数据中,还是限制在单个列中?如果我们不必检查每个单元格,那么最终的代码将更快。

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

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,以便格式字符串与您在格式对话框/"自定义格式"中看到的字符串相同。但这并不重要,只是为了方便。

我真的不喜欢使用'内部'格式字符串"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 Objectv
                
        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

你可以用这个方法解决你的问题:

Function fDateAdd(SearchTextas Date, DateUnit as String, ModAmount as Interger)
    
    FoundText = RegEx(SearchText, "######")
    Do
        If IsDate(FoundText) And (Mid(FoundText, 5, 2)="19" Or Mid(FoundText, 5, 2)="20") Then
            ReplaceWithText = DateAdd(DateUnit, ModAmount, CDate(FoundText))
            fDateAdd = Replace(SearchText, FoundText, ReplaceWithText)
        End If
        FoundText = RegEx(SearchText, "######")
    Loop While FoundText <> ""
End Function

最新更新