更改日期格式[MS Word]

时间:2018-09-22 14:23:08

标签: vba ms-word word-vba

我需要一个宏来更改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”: “查找内容”文本包含一个过于复杂的模式匹配表达式。

谢谢

2 个答案:

答案 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函数拆分从范围文本创建两个数组。第一个通过在','处将字符串拆分为时间和日期,第二个通过在'/'处将字符串拆分为日,月,年。