2017-08-16 183 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

相關問題