web-dev-qa-db-ja.com

MS Word 2010のドキュメント全体(表を含む)のテキストを検索して置換するには

テーブルを含むMS Word文書があります。次のコードを使用して、VBA経由でテキストを検索して置換しようとしています。

If TextBox1.Text <> "" Then
    Options.DefaultHighlightColorIndex = wdNoHighlight
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    Selection.Find.Replacement.Highlight = True
    With Selection.Find
        .Text = "<Customer_Name>"
        .Replacement.Text = TextBox1.Text
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With

Selection.Find.ClearFormatting
    With Selection.Find.Font
    .Italic = True
    End With
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find.Replacement.Font
    .Italic = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
    End If

これは、テーブルのoutsideであるすべてのコンテンツを置き換える場合に正常に機能します。ただし、テーブル内のコンテンツは置き換えられません。

7
122user321

ドキュメント全体で置換を実行することが目的である場合(コードからはそう見えますが、明示的ではありません)、Selectionオブジェクトの代わりにDocument.Rangeを使用することをお勧めします。 Document.Rangeを使用すると、テーブル内であっても、すべてが置き換えられます。

また、カーソル(または選択)はマクロによって移動されないため、ユーザーにとってより透過的です。

Sub Test()
  If TextBox1.Text <> "" Then
    Options.DefaultHighlightColorIndex = wdNoHighlight
    With ActiveDocument.Range.Find
      .Text = "<Customer_Name>"
      .Replacement.Text = TextBox1.Text
      .Replacement.ClearFormatting
      .Replacement.Font.Italic = False
      .Forward = True
      .Wrap = wdFindContinue
      .Format = False
      .MatchCase = False
      .MatchWholeWord = False
      .MatchWildcards = False
      .MatchSoundsLike = False
      .MatchAllWordForms = False
      .Execute Replace:=wdReplaceAll
    End With
  End If
End Sub
15
d-stroyer

次のコードを使用しましたが、ドキュメントで見つかったすべてのオカレンスに対して、charm .....のように機能します。

  stringReplaced = stringReplaced + "string to be searched"
For Each myStoryRange In ActiveDocument.StoryRanges
    With myStoryRange.Find
        .Text = "string to be searched"
        .Replacement.Text = "string to be replaced"
        .Wrap = wdFindContinue
        .ClearFormatting
        .Replacement.ClearFormatting
        .Replacement.Highlight = False
        .Execute Replace:=wdReplaceAll
    End With
Next myStoryRange  
7
122user321