2012-11-20 108 views
8

我創建了一個MS Word宏,用於搜索某些文本(用標記代碼表示),剪切文本並將其插入到新的腳註中,然後刪除標記代碼腳註。現在我想讓宏重複,直到它在文本中找不到更多標記代碼。
這裏的下面重複Microsoft Word VBA,直到找不到搜索結果

Sub SearchFN() 

'find a footnote 
Selection.Find.ClearFormatting 
With Selection.Find 
    .Text = "&&FB:*&&FE" 
    .Replacement.Text = "" 
    .Forward = True 
    .Wrap = wdFindContinue 
    .Format = False 
    .MatchCase = False 
    .MatchWholeWord = False 
    .MatchKashida = False 
    .MatchDiacritics = False 
    .MatchAlefHamza = False 
    .MatchControl = False 
    .MatchByte = False 
    .MatchAllWordForms = False 
    .MatchSoundsLike = False 
    .MatchFuzzy = False 
    .MatchWildcards = True 
End With 
Selection.Find.Execute 

'cut the footnote from the text 
Selection.Cut 

'create a proper Word footnote 
With Selection 
    With .FootnoteOptions 
     .Location = wdBottomOfPage 
     .NumberingRule = wdRestartContinuous 
     .StartingNumber = 1 
     .NumberStyle = wdNoteNumberStyleArabic 
    End With 
    .Footnotes.Add Range:=Selection.Range, Reference:="" 
End With 

'now paste the text into the footnote 
Selection.Paste 

'go to the beginning of the newly created footnote 
'and find/delete the code for the start of the note (&&FB:) 
    Selection.Find.ClearFormatting 
Selection.Find.Replacement.ClearFormatting 
With Selection.Find 
    .Text = "&&FB:" 
    .Replacement.Text = "" 
    .Forward = False 
    .Wrap = wdFindContinue 
    .Format = False 
    .MatchCase = False 
    .MatchWholeWord = False 
    .MatchKashida = False 
    .MatchDiacritics = False 
    .MatchAlefHamza = False 
    .MatchControl = False 
    .MatchByte = False 
    .MatchAllWordForms = False 
    .MatchSoundsLike = False 
    .MatchFuzzy = False 
    .MatchWildcards = True 
End With 
Selection.Find.Execute 
With Selection 
    If .Find.Forward = True Then 
     .Collapse Direction:=wdCollapseStart 
    Else 
     .Collapse Direction:=wdCollapseEnd 
    End If 
    .Find.Execute Replace:=wdReplaceOne 
    If .Find.Forward = True Then 
     .Collapse Direction:=wdCollapseEnd 
    Else 
     .Collapse Direction:=wdCollapseStart 
    End If 
    .Find.Execute 
End With 

'do same for ending code (&&FE) 
With Selection.Find 
    .Text = "&&FE" 
    .Replacement.Text = "" 
    .Forward = True 
    .Wrap = wdFindContinue 
    .Format = False 
    .MatchCase = False 
    .MatchWholeWord = False 
    .MatchKashida = False 
    .MatchDiacritics = False 
    .MatchAlefHamza = False 
    .MatchControl = False 
    .MatchByte = False 
    .MatchAllWordForms = False 
    .MatchSoundsLike = False 
    .MatchFuzzy = False 
    .MatchWildcards = True 
End With 
Selection.Find.Execute 
With Selection 
    If .Find.Forward = True Then 
     .Collapse Direction:=wdCollapseStart 
    Else 
     .Collapse Direction:=wdCollapseEnd 
    End If 
    .Find.Execute Replace:=wdReplaceOne 
    If .Find.Forward = True Then 
     .Collapse Direction:=wdCollapseEnd 
    Else 
     .Collapse Direction:=wdCollapseStart 
    End If 
    .Find.Execute 
End With 

Selection.HomeKey Unit:=wdStory 
'now repeat--but how??  

End Sub 

回答

11

問得好宏觀這一塊,你可以通過使用Selection.Find.Found結果整個文檔循環。

你要做的就是開始一個搜索,如果你發現一個結果只有在Selection.Find.Found結果爲真時才進入循環。一旦你完成了這些,你就完成了。下面的代碼應該很好地爲你做這個技巧。

Sub SearchFN() 
    Dim iCount As Integer 

    'Always start at the top of the document 
    Selection.HomeKey Unit:=wdStory 

    'find a footnote to kick it off 
    With Selection.Find 
     .ClearFormatting 
     .Text = "&&FB:*&&FE" 
     .Replacement.Text = "" 
     .Forward = True 
     .Wrap = wdFindContinue 
     .Format = False 
     .MatchCase = False 
     .MatchWholeWord = False 
     .MatchKashida = False 
     .MatchDiacritics = False 
     .MatchAlefHamza = False 
     .MatchControl = False 
     .MatchByte = False 
     .MatchAllWordForms = False 
     .MatchSoundsLike = False 
     .MatchFuzzy = False 
     .MatchWildcards = True 
     .Execute 
    End With 

    'If we find one then we can set off a loop to keep checking 
    'I always put a counter in to avoid endless loops for one reason or another 
    Do While Selection.Find.Found = True And iCount < 1000 
     iCount = iCount + 1 

     'Jump back to the start of the document. Since you remove the 
     'footnote place holder this won't pick up old results 
     Selection.HomeKey Unit:=wdStory 
     Selection.Find.Execute 

     'On the last loop you'll not find a result so check here 
     If Selection.Find.Found Then 

      ''================================== 
      '' Do your footnote magic here 
      ''================================== 

      'Reset the find parameters 
      With Selection.Find 
       .ClearFormatting 
       .Text = "&&FB:*&&FE" 
       .Replacement.Text = "" 
       .Forward = True 
       .Wrap = wdFindContinue 
       .Format = False 
       .MatchCase = False 
       .MatchWholeWord = False 
       .MatchKashida = False 
       .MatchDiacritics = False 
       .MatchAlefHamza = False 
       .MatchControl = False 
       .MatchByte = False 
       .MatchAllWordForms = False 
       .MatchSoundsLike = False 
       .MatchFuzzy = False 
       .MatchWildcards = True 
      End With 
     End If 
    Loop 
End Sub 
相關問題