2017-08-16 246 views
0

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

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循环。任何帮助,将不胜感激。

+0

你不需要MonthNames中的数组。有一个内置的函数可以使用'monthname(10)' – jsotola

+0

Word的'Find'和'Selection'以复杂的方式相互作用,参见例如。 [这里](http://gregmaxey.com/word_tip_pages/words_fickle_vba_find_property.html)。在For循环开始时,可​​以通过Selection.HomeKey单元= wdStory来将选择移回到文档顶部。 – xidgel

+0

我不认为这与你的问题有关,但是你应该在文本上使用'格式',当它应该用于数字值时。我推荐一些类似'myDate = CDate(.Text)+ 7',然后是'.Text = Format(myDate,“mmmm d,yyyy”)' – xidgel

回答

0

试试这个代码

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 
+0

这样就可以选择所有的日期。虽然DateAdd函数不适用于我。看起来我必须更改为“mm/dd/yy”格式才能将日期标记为已更改,然后重新搜索以重新格式化日期。谢谢你的帮助! –

+0

你想做什么是没有意义的。为什么要搜索两次?你有什么版本的ms字? – jsotola

+0

说_DateAdd函数不适用于我虽然._不提供任何信息。发生了什么? – jsotola