2017-08-07 58 views
0

我想建立一個宏(作爲一個小白)找到某些字,然後更改該字的格式(即使其粗體或斜體)Word宏搜索和替換格式化問題

此代碼「排序的作品。「它會找到一些詞語並改變它們,但不會改變其他詞語。奇怪的是它是有效的,直到我添加另一個子然後它停止格式化一些單詞,而格式化其他。例程永遠不會中斷並運行,直到最終沒有錯誤。

任何人都可以教導爲什麼發生這種情況,我做錯了什麼?我不是程序員。謝謝

Sub Macro2() 
' 
' Macro2 Macro 
' 
' 
    Selection.Find.ClearFormatting 
    Selection.Find.Replacement.ClearFormatting 
    With Selection.Find 
     .Text = "Printer" 
     .Replacement.Text = "" 
     .Replacement.Font.bold = True 
     .Forward = True 
     .Wrap = wdFindContinue 
     .Format = True 
     .MatchCase = False 
     .MatchWholeWord = True 
     .MatchWildcards = False 
     .MatchSoundsLike = False 
     .MatchAllWordForms = False 
    End With 
    Selection.Find.Execute Replace:=wdReplaceAll 
    With Selection.Find 
     .Text = "Parameter Values" 
     .Replacement.Text = "" 
     .Replacement.Font.bold = True 
     .Forward = True 
     .Wrap = wdFindContinue 
     .Format = True 
     .MatchCase = False 
     .MatchWholeWord = False 
     .MatchWildcards = False 
     .MatchSoundsLike = False 
     .MatchAllWordForms = False 
    End With 

    With Selection.Find 
     .Text = "Use All Applicants Indicator" 
     .Replacement.Text = "" 
     .Replacement.Font.bold = True 
     .Forward = True 
     .Wrap = wdFindContinue 
     .Format = True 
     .MatchCase = False 
     .MatchWholeWord = False 
     .MatchWildcards = False 
     .MatchSoundsLike = False 
     .MatchAllWordForms = False 
    End With 

    With Selection.Find 
     .Text = "Next Section" 
     .Replacement.Text = "" 
     .Replacement.Font.bold = True 
     .Forward = True 
     .Wrap = wdFindContinue 
     .Format = True 
     .MatchCase = False 
     .MatchWholeWord = False 
     .MatchWildcards = False 
     .MatchSoundsLike = False 
     .MatchAllWordForms = False 
    End With 

回答

1

我會編程搜索宏作爲一個單獨的子,就像這樣。

Private Sub FindAndReplace(ByVal Txt As String, _ 
          Optional ByVal NewTxt As String, _ 
          Optional ByVal Fmt As Boolean = False, _ 
          Optional ByVal BldFmt As Boolean = False) 

    With ActiveDocument.Content 
     With .Find 
      .ClearFormatting 
      .Text = Txt 
      .Format = Fmt Or BldFmt 

      With .Replacement 
       .ClearFormatting 
       .Text = NewTxt 
       .Font.Bold = BldFmt 
      End With 
      .Forward = True 
      .Wrap = wdFindContinue 
      .MatchCase = False 
      .MatchWholeWord = True 
      .MatchWildcards = False 
      .MatchSoundsLike = False 
      .MatchAllWordForms = False 
     End With 
     .Find.Execute Replace:=wdReplaceAll 
    End With 
End Sub 

您可能使用但沒有必要的所有可選參數。 然後我會反覆調用子用不同的參數,也許是這樣的: -

Sub MakeReplacements1() 

    FindAndReplace "Printer", BldFmt:=True 
    FindAndReplace "Parameter values", BldFmt:=True 
    FindAndReplace "Use All Applicants Indicator", BldFmt:=True 
    FindAndReplace "Next Section", BldFmt:=True 
End Sub 

,甚至是這樣的: -

Sub MakeReplacements2() 

    Dim Fnd() As String 
    Dim i As Long 

    Fnd = Split("Printer|Parameter values|Use All Applicants Indicator|Next Section", "|") 
    For i = 0 To UBound(Fnd) 
     FindAndReplace Fnd(i), BldFmt:=True 
    Next i 
End Sub 
1

Selection是包含當前所選文檔的一部分的對象。 FindSelection對象的屬性,它定義了Find對象(同名,但一個是屬性,另一個是對象)。 Find對象具有諸如Text,Forward, Wrap等的屬性,並且它具有諸如ClearFormattingExecute的方法。所有這些你可以在MSDN庫中閱讀。

現在,當您定義Find對象時,您正在描述要查找的內容。隨着Execute命令,你開始尋找它。您的代碼在某些地方缺少此命令。

搜索僅限於Selection。如果您選擇了任何內容,Word將假定您要搜索整個文檔。但Selection.Find將更改選擇以突出顯示找到的項目。因此,如果要繼續搜索整個文檔,則每次搜索後都需要重置選區,例如Activedocument.Content.Select

概括地說,如果你在每次使用後清除Find對象,設置每個重複使用前一新的描述,定義每個搜索Selection對象,不要忘記Execute每個單獨的搜索你的代碼應該工作一樣你打算工作。

+0

添加的execute工作。謝謝。不過,我相信必須有一個更乾淨的方法來做到這一點。我正在嘗試閱讀,但MSDN文檔對我沒有意義。不過謝謝。 – esponapule