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

时间:2015-08-21 09:41:09

标签: excel-vba date replace find vba

我已经扫描并找到了许多类似的问题答案,虽然它们都没有完全勾选方框,所以我会解释我之后的内容并希望它有意义:

  • 我已将数据导入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 

我认为有一些先前的定义需要在上述代码可行之前执行,但如果有人可以提供帮助,我会很感激!

非常感谢,

罗宾。

3 个答案:

答案 0 :(得分:1)

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

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

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

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

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

你可以尝试:

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

我没有尝试过,我找不到任何解释可以搜索哪种格式类型的文档。如果这样做,它几乎肯定比基于以下信息的任何东西更快更容易。

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

  • 将字符串识别为日期。
  • 将该字符串转换为数字。
  • 使用表示日期的数字格式存储该号码。

Excel将日期存储为自19/1/19以来的天数。例如,“2015年8月21日”将被存储为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”,然后将新字符串测试为日期。

答案 1 :(得分:0)

这是我的建议:

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

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

的单元格

我在这里使用NumberFormatLocal,以便格式字符串与您在格式对话框/&#34;自定义格式&#34;中看到的格式字符串相同。但这在这里并不重要,只是方便。

我真的不喜欢同时使用&#39;内部&#39;格式字符串&#34; yyyy&#34;和本地化的格式字符串&#34; JJJJ&#34;但这就是DateAdd想要它的方式。

答案 2 :(得分:0)

您始终可以创建自己的 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