VBA - 在包含格式 'DDMMYYYY' 的文本中查找日期
VBA - Find date within text containing format 'DDMMYYYY'
我已经扫描并找到了许多与我的问题类似的答案,尽管其中 none 非常符合要求,所以我将解释我所追求的,希望它是有意义的:
- 我已将数据从 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 . . .)
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
我已经扫描并找到了许多与我的问题类似的答案,尽管其中 none 非常符合要求,所以我将解释我所追求的,希望它是有意义的:
- 我已将数据从 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 . . .)
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