2017-08-07 4 views
0

を交換し、私は特定の単語を検索し、その単語の書式を変更する(noobのような)マクロを構築しようとしています(すなわち、それは太字や斜体にする)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は、現在選択されているドキュメントの一部を構成するオブジェクトです。 FindFindオブジェクト(同じ名前ですが、1つはプロパティ、もう1つはオブジェクト)を定義するSelectionオブジェクトのプロパティです。 Findオブジェクトは、Text,Forward,Wrapなどのプロパティを持ち、ClearFormattingまたはExecuteのようなメソッドを持っています。このすべては、MSDNライブラリで読むことができます。

ここでFindオブジェクトを定義すると、探したいものが記述されています。 Executeコマンドを使うと、それを探し始めるでしょう。あなたのコードには、このコマンドがいくつかの場所で欠落しています。

検索はSelectionに制限されています。あなたが何も選択しなかった場合、Wordは文書全体を検索したいと考えます。しかしSelection.Findは、選択されたアイテムを強調表示するように選択を変更します。したがって、ドキュメント全体の検索を続行する場合は、各検索後に選択をリセットする必要があります(例:Activedocument.Content.Select)。一言で言えば

、あなたはそれぞれの使用後にFindオブジェクトをクリアした場合、各繰り返し使用する前に新しい説明を設定し、各検索のためのSelectionオブジェクトを定義し、それぞれがあなたのコードは同じように動作するはず検索分離Executeに忘れてはいけませんあなたはそれが働くことを意図しています。

+0

を働いた実行の追加します。ありがとうございました。しかし、私はこれを行うためのよりクリーンな方法がなければならないと確信しています。私は読むことを試みていますが、MSDNのドキュメントは私には意味がありません。しかし、ありがとう。 – esponapule