【问题标题】:Find and Replace Dates in a Word Document with VBA使用 VBA 查找和替换 Word 文档中的日期
【发布时间】:2017-08-16 16:56:07
【问题描述】:

我在 Word 文档的文本中查找格式为“2017 年 8 月 16 日”的任何日期时遇到问题。使用 ActiveDocument.Content.Find,我只能在第一页上找到结果。即使在第一页,结果也不一致。下面是我的代码。

Dim myMonth(1 To 12) As String
myMonth(1) = "January"
myMonth(2) = "February"
myMonth(3) = "March"
myMonth(4) = "April"
myMonth(5) = "May"
myMonth(6) = "June"
myMonth(7) = "July"
myMonth(8) = "August"
myMonth(9) = "September"
myMonth(10) = "October"
myMonth(11) = "November"
myMonth(12) = "December"

'Find and replace dates in MMMM dd, yyyy format
For i = 12 To 1 Step -1
    With ActiveDocument.Content
    With .Find
        .Text = "(" & myMonth(i) & ")" & " ([0-9]{1,2}), ([0-9]{4})"
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindStop
        .MatchWildcards = True
    End With

    While .Find.Execute
        .Text = CDate(.Text) + 7
        .Text = Format(.Text, "mmmm d, yyyy")

    Wend
        .Find.MatchWildcards = False
    End With

    Next i

此代码以所述格式将任何日期添加 7 天。我试过循环所有的故事,结果是一样的。我已经能够对格式为“08/16/2017”的日期执行此任务,因此问题似乎在于每个月的额外 For 循环。任何帮助将不胜感激。

【问题讨论】:

  • 您不需要月份名称数组。有一个内置函数可以使用monthname(10)
  • Word 的 FindSelection 以复杂的方式交互,参见例如here。在 For 循环的开头使用 Selection.HomeKey Unit:=wdStory 将所选内容移回文档顶部可能会有所帮助。
  • 我认为这与您的问题无关,但您在文本上使用 Format,而它应该用于数值。我会推荐类似myDate = CDate(.Text) + 7,然后是.Text = Format(myDate, "mmmm d, yyyy")

标签: vba ms-word


【解决方案1】:

试试这个代码

Sub findMe()

    Dim aaa As Find
    Dim i As Integer

    For i = 1 To 12
        Debug.Print MonthName(i)

        Set aaa = ActiveDocument.Range(Start:=1, End:=1).Find    ' start at beginning of document

        aaa.ClearFormatting
        aaa.Replacement.ClearFormatting

        aaa.Forward = True
        aaa.Wrap = wdFindStop
        aaa.Format = False
        aaa.MatchCase = False
        aaa.MatchWholeWord = False
        aaa.MatchAllWordForms = False
        aaa.MatchSoundsLike = False
        aaa.MatchWildcards = True
        aaa.Replacement.Text = ""

        ' search text starts with any character so that upper case and lower case words are found .... july July
        aaa.Text = "?" & Mid(MonthName(i), 2, 20) & "[ ^t]{1,5}([0-9]{1,2}),[ ^t]{1,5}([0-9]{4})"

        Do While True
            DoEvents
            If Not aaa.Execute Then Exit Do                    ' find next

            Debug.Print aaa.Parent.Text                        ' found text 
            Debug.Print Format(aaa.Parent.Text, "mm/dd/yy")    ' reformat date
            Debug.Print DateAdd("d", 7, aaa.Parent.Text)       ' add 7 days
            Debug.Print Format(DateAdd("d", 7, aaa.Parent.Text), "mmmm dd, yyyy")

            ' aaa.Parent is the range object of the found text
            ' so you can do this ...
            aaa.Parent.Text = Format(DateAdd("d", 7, aaa.Parent.Text), "mm/dd/yy")
            aaa.Parent.Collapse Direction:=wdCollapseEnd           ' point to "just after replaced text"

        Loop
    Next i
End Sub

【讨论】:

  • 这可以选择所有日期。 DateAdd 功能对我不起作用。看来我必须更改为“mm/dd/yy”格式才能将日期标记为已更改,然后重新搜索以重新格式化日期。感谢您的帮助!
  • 你想做的事毫无意义。为什么要搜索两次?你有什么版本的ms word?
  • DateAdd 函数对我不起作用。 没有提供任何信息。发生了什么?
  • 我的理解是,如果您不将日期更改为其他格式,则此代码将继续循环更改日期。 DateAdd 函数没有增加 7 天 - 它什么也没做。
  • 您的日期仍然是长日期格式? 2017 年 8 月 16 日
猜你喜欢
  • 2017-08-06
  • 2021-03-13
  • 2019-01-31
  • 2021-10-13
  • 2018-11-11
  • 2012-03-08
  • 1970-01-01
  • 2021-04-27
  • 2019-05-20
相关资源
最近更新 更多