首页 文章

更改日期格式[MS Word]

提问于
浏览
-1

我需要一个宏来更改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

    我做了一些调查,发现Word中的查找/替换的限制(我正在使用Office 365,Word 2016) .

    之前的回答错过了您也在日期内进行转置的事实 .

    当我构建查找查询时,其中日期也根据需要进行转置我得到了

    “([]()(,)(@)()(/)()(/)()(])”

    但它不起作用,给出你报告的相同错误 . 经过一番调查后,似乎这是由于查找字段数量限制为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个或更多字符的查找字段,并且建议的查找查询将使用一个或多个空格,但不存在空格时 .

    你会注意到在我的查找查询中我没有查找数字,只查找分隔符 . 这意味着查找/替换将同样适用于具有月份名称而非月份数字的日期,例如21 /月/ 2017 .

    如果你确实想要一个编程解决方案,那么我建议避免使用find / replace,而是使用范围movewhile / moveuntil方法,因为你有一个由[和]限定的明确定义的字段 . 然后,您可以使用VBA函数拆分从范围文本创建两个数组 . 第一个将字符串拆分为时间和日期,通过拆分','和第二个拆分,通过拆分'/'将日期分为日,月,年

  • 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
    

    Note: 如果您需要将{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
    

相关问题