我需要一个宏来更改Word中的日期和时间格式
发件人: [11:47,9/21/2017]
收件人: 21/09/2017,11:47-
我有一个超过9000行的文档需要更改。这有可能吗?我读了几件事可以更改日期,但没有任何内容可以更改日期和时间。
任何帮助将不胜感激
谢谢
到目前为止我所拥有的:
Sub GetDateAndReplace()
Dim FoundOne As Boolean
Selection.HomeKey Unit:=wdStory, Extend:=wdMove
FoundOne = True ' loop at least once
Do While FoundOne ' loop until no date is found
With Selection.Find
.ClearFormatting
.Replacement.ClearFormatting
.Text = "([0-9]{2,2})[:]([0-9]{2,2})[,]([0-9]{1,2})[/]([0-9]{1,2})[/]([0-9]{4})"
.Format = True
.Forward = True
.MatchWildcards = True
End With
Selection.Find.Execute Replace:=wdReplaceNone
' check the find to be sure it's a date
If IsDate(Selection.Text) Then
Selection.Text = Format(Selection.Text, " dd/mm/yyyy, hh:mm")
Selection.Collapse wdCollapseEnd
Else ' not a date - end loop
FoundOne = False
End If
Loop
结束子
但是我得到这个错误
运行时错误“ 6003”: “查找内容”文本包含一个过于复杂的模式匹配表达式。
谢谢
答案 0 :(得分:0)
您真的不需要在表达式两边加上所有括号和分组括号。您甚至都不需要宏。尝试三种wildcard
查找/替换操作,其中:
Find = ([0-9]{1,2}:[0-9]{2}, )([0-9]/[0-9]{1,2}/[0-9]{4})
Replace = \10\2
Find = ([0-9]{1,2}:[0-9]{2}, [0-9]{2}/)([0-9]/[0-9]{4})
Replace = \10\2
Find = ([0-9]{1,2}:[0-9]{2}), ([0-9]{2}/)([0-9]{2}/)([0-9]{4})
Replace = \3\2\4, \1
注意:如果您使用的是非英语的区域日期设置,则需要将{1,2}更改为{1; 2}。
如果您确实需要宏,可以使用:
Sub Demo()
Application.ScreenUpdating = False
With ActiveDocument.Range
With .Find
.ClearFormatting
.Replacement.ClearFormatting
.Forward = True
.Format = False
.Wrap = wdFindContinue
.MatchWildcards = True
.Text = "([0-9]{1,2}:[0-9]{2}, )([0-9]/[0-9]{1,2}/[0-9]{4})"
.Replacement.Text = "\10\2"
.Execute Replace:=wdReplaceAll
.Text = "([0-9]{1,2}:[0-9]{2}, [0-9]{2}/)([0-9]/[0-9]{4})"
.Execute Replace:=wdReplaceAll
.Text = "([0-9]{1,2}:[0-9]{2}), ([0-9]{2}/)([0-9]{2}/)([0-9]{4})"
.Replacement.Text = "\3\2\4, \1"
.Execute Replace:=wdReplaceAll
End With
End With
Application.ScreenUpdating = True
End Sub
答案 1 :(得分:0)
我进行了更多调查,发现对Word中的查找/替换有所限制(我正在使用Office 365,Word 2016)。
上一个答案错过了您也在日期内进行移调的事实。
当我建立查找查询时,其中的日期也根据需要进行了转换
“([[](*)(,)(@)(*)(/)(*)(/)(*)(])”
,但无法正常工作,并给出与您报告的相同的错误。经过更多调查后,似乎这是由于find字段的数量限制为9。
给出123456789A的文本,然后搜索
“(1)(2)(3)(4)(5)(6)(7)(8)(9)”
工作正常,但
“(1)(2)(3)(4)(5)(6)(7)(8)(9)(A)”
失败。
在您的特定情况下,我们可以通过将(,)更改为just,将查找字段的数目减少到9,从而提供查找查询
“([[](*),(@)(*)(/)(*)(/)(*)(])”
这意味着您现在可以使用替换指令
来重建日期。“ \ 6 // \ 4 // \ 8,\ 1-”
如果您无法将搜索简化为9个以下的搜索字段,则需要进行多次搜索。对于您而言,第一种方法是使用上一个答案中显示的查找/替换来转置时间和日期,第二种方法是在日期内进行转置。
顺便说一句,如果您不能保证逗号后总是有一个或多个空格,则应进行初始查找/替换以在逗号后添加空格。这是因为没有适用于0个或多个字符的查找字段,并且建议的查找查询将使用一个或多个空格,但在没有空格的情况下将不起作用。
您会注意到,在查找查询中,我没有查找数字,只是查找分隔符。这意味着“查找/替换”将与具有月份名称而不是月份数字的日期同样有效。 2017年9月21日。
如果您确实需要编程的解决方案,那么我建议您避免使用find / replace,而应使用range movewhile / moveuntil方法,因为您有一个由[和]限定的字段。然后,您可以使用VBA函数拆分从范围文本创建两个数组。第一个通过在','处将字符串拆分为时间和日期,第二个通过在'/'处将字符串拆分为日,月,年。