将字符串格式的月份转换为Word宏中的数字

时间:2019-03-10 07:46:15

标签: vba date ms-word

我正在使用Word宏,该宏必须将日期转换为另一种格式。

输入:2019年3月10日

预期产量:10/03/2019

问题在于日期的月份是字符串(2019年3月10日)。 我找不到将日期转换为dd / mm / YYYY的方法。

到目前为止,我发现的所有内容都从dd-mm-YYYY转换为文本日期。

上面的代码可以从dd / mm / yyyy转换为带有字符串month或其他格式的日期,但是从不输入isDate()函数。如果删除了isDate()函数,则该格式不会执行。

这是我到目前为止所拥有的:

Sub ChangeDates()

FoundOne = True ' loop at least once

Do While FoundOne ' loop until no date is found
    With Selection.Find
        .ClearFormatting
        .Replacement.ClearFormatting
        .Text = "([0-9]{1,2}) de (*) de ([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")
        Selection.Font.Color = wdColorLightOrange
        Selection.Collapse wdCollapseEnd
    Else ' not a date - end loop
        FoundOne = False
    End If
Loop

End Sub

有没有办法做到这一点? 预先感谢!

3 个答案:

答案 0 :(得分:1)

为使Word-VBA识别日期,数据必须与日期的系统设置匹配。例如,如果系统设置为美国英语,则问题中的日期将不会被识别为有效日期,只会识别美国英语的日期。

VBA代码将需要包含将文本内容解析为特定语言中的日期的逻辑。然后,它需要将其转换为与系统日期匹配的日期,以便Format函数可以正常工作,或者还需要进行格式转换。

答案 1 :(得分:0)

我尝试了@macropod,尽管它对我不起作用,但我知道他的解决方案是有效的(可能是语言方面的一些Word问题),需要进行一些更改才能使它起作用,因此也可以随时使用它。

我接受@Cindy Meister的建议,这是代码。这种方法的缺点是,您必须进行两次搜索而不是一次搜索,但是优点是您使用Word Format内置函数,并且可以随时更改格式。

Private Sub FechasEnTexto()

'We take the date to english format (dd M, Y)
With ActiveDocument.Range.Find
     .Text = "([0-9]{1,2}) de (*) de ([0-9]{4})"
     .Replacement.Text = "\1 \2, \3"
     .Forward = True
     .MatchWildcards = True
     .Execute replace:=wdReplaceAll
End With


'Here we look for the english format, and proceed to apply the format desired.   
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]{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")
        Selection.Collapse wdCollapseEnd
    Else ' not a date - end loop
        FoundOne = False
    End If
Loop


End Sub

答案 2 :(得分:-5)

Nicolas,可能在IF语句之前使用 NumberFormat 。这样,您正在设置格式以确保 IsDate 表达式显示为True,因此将满足您的 IF 条件。

Selection.NumberFormat = "dd-mm-yyyy"
If IsDate(Selection.Text) Then
    Selection.Text = Format(Selection.Text, "dd-mm-yyyy")
    Selection.Font.Color = wdColorLightOrange
    Selection.Collapse wdCollapseEnd
Else ' not a date - end loop
    FoundOne = False
End If