我正在使用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
有没有办法做到这一点? 预先感谢!
答案 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