Vba 更改日期格式

Vba 更改日期格式,vba,ms-word,Vba,Ms Word,我需要一个宏来更改Word中的日期和时间格式 发件人: [11:479/21/2017] 致: 2017年9月21日,11:47- 我有一份9000多行的文件需要修改。这可能吗?我读过一些允许我更改日期的东西,但没有任何东西允许我更改日期和时间 到目前为止,我所拥有的: Sub GetDateAndReplace() Dim FoundOne As Boolean Selection.HomeKey Unit:=wdStory, Extend:=wdMove FoundOne = True '

我需要一个宏来更改Word中的日期和时间格式

发件人: [11:479/21/2017]

致: 2017年9月21日,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
End Sub
但是我得到了这个错误

运行时错误“6003”:查找包含模式匹配的文本 表达式太复杂了


你真的不需要所有的括号和分组括号围绕表达式。你甚至不需要宏。尝试三种通配符查找/替换操作,其中:

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

我做了更多的调查,发现了Word中的find/replace(我使用的是Office 365,Word 2016)

前面的答案忽略了一个事实,即您也在日期内转换

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

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

但它不起作用,给出了与您报告的相同的错误。经过进一步的调查,这似乎是由于find字段的数量限制为9

给定文本123456789A,然后搜索

(1)(2)(3)(4)(5)(6)(7)(8)(9)

很好,但是

(1)(2)(3)(4)(5)(6)(7)(8)(9)(A)

失败了

在您的特定情况下,我们可以通过将(,)更改为just,将find字段的数量减少到9,并提供

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

这意味着您现在可以使用替换指令重新生成日期

“\6/\4/\8\1”

如果无法将搜索简化为9个或更少的查找字段,则需要执行多个搜索。在您的情况下,第一个是使用上一个答案中提供的查找/替换来转置时间和日期,第二个是在日期内转置

另一方面,如果不能保证逗号后始终有一个或多个空格,则应进行初始查找/替换,在逗号后添加空格。这是因为没有适用于0个或多个字符的查找字段,建议的查找查询将适用于一个或多个空格,但不适用于没有空格的情况

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


如果您确实想要一个编程解决方案,那么我建议您避免使用find/replace,而是使用range movewhile/moveuntil方法,因为您有一个定义良好的字段,该字段以[and]为边界。然后可以使用VBA函数split从范围文本创建两个数组。第一个将通过在“,”处拆分将字符串拆分为时间和日期,第二个将通过在“/”处拆分将日期拆分为天、月、年。

使用更简单的搜索,例如,查找文本应为“([)(*)(])”。这不起作用,我知道搜索更简单,但它会抛出IsDate。找到的范围现在将包括[and]所以在你使用IsDate之前,这些都需要删除。这几乎是有效的。首先,将{1,2}更改为{1;2}会生成一个错误,表示表达式无效。我确实需要交换日期,以便将日期从年月日更改为年月日。但是这个解决方案也不适用于预加零。像2017年2月3日这样的日期需要变成2002年3月/2017@rxssmcdxwell:答案已用宏更新,用于预结束0s。