LoginSignup
1
4

More than 5 years have passed since last update.

Word VBA | 選択範囲内で置換

Last updated at Posted at 2018-06-05

やりたいこと

Word VBAで検索、置換を自動化するには、Findオブジェクトを使った方法が知られています。

Word VBAで文字列を置換する方法!いくつかの基本パターンを徹底解説

この方法は、Wordの仕様で、文章全体、上方向、下方向のいずれかしか検索、置換できません。つまり、選択範囲内の文章だけを対象にして検索、置換できないことが不便です。そこで、選択された文章を対象にして、置換を行うVBAコードを作りました。

単純な置換

一番簡単な方法 (Findオブジェクトの利用)

下記のコードの、"検索したい単語"、"置換したい単語"を実際に検索したい単語と置換したい単語に置き換えれば使用できます。
こちらは、Wordに標準搭載されている検索機能を使うVBAのため、最も簡単です。

Module1
'選択範囲内で置換
Public Sub replaceInSelected()
    Dim strSearch As String, strRep As String
    Dim rng As Range
    Set rng = Selection.Range
    strSearch = "検索したい単語"
    strRep = "置換したい単語"

    rng.Collapse wdCollapseStart
    Do
        With rng.Find
            .ClearFormatting
            .Text = strSearch
            .Execute Replacewith:=strRep, Replace:=wdReplaceOne
            If .Found = False Then Exit Do
        End With
        If rng.End > Selection.Range.End Then Exit Do 'エラー回避
        Set rng = ActiveDocument.Range(rng.End, Selection.Range.End)
    Loop

End Sub

もう一つの方法 (RegExpオブジェクトの利用)

ちなみに、正規表現をWordで取り扱うためのRegExpオブジェクトを使用しても同じことができます。
こちらは、Wordの標準機能でないため、CreateObjectでVBScriptのRegExpオブジェクトを呼び出して使用します。
Findオブジェクトより癖がないので、使いやすい反面、String型でデータを渡しているので、書式が消えてしまうのがデメリットです。

Module2
'選択範囲内で置換-2
Public Sub replaceInSelected2()
    Dim strSearch As String, strRep As String
    strSearch = "検索したい単語"
    strRep = "置換したい単語"

    Dim re As Object
    Set re = CreateObject("VBScript.RegExp")
    With re
        .Pattern = strSearch
        .ignorecase = False
        .Global = True
        Selection.Range.Text = .Replace(Selection.Range.Text, strRep)
    End With

End Sub

書式の置換

太字の単語にアンダーラインを付ける場合のマクロです。書式を変更する場合は、Findオブジェクトの方がはるかに簡単です。

Module3
'選択範囲内で書式の置換
Public Sub replaceInSelected3()
    Dim rng As Range
    Set rng = Selection.Range

    rng.Collapse wdCollapseStart
    Do
        With rng.Find
            .ClearFormatting
            .Font.Bold = True
            With .Replacement
                .ClearFormatting
                .Font.Underline = wdUnderlineThick
            End With
            .Execute Format:=True, Replace:=wdReplaceOne
            If .Found = False Then Exit Do
        End With
        If rng.End > Selection.Range.End Then Exit Do
        Set rng = ActiveDocument.Range(rng.End, Selection.Range.End)
    Loop

End Sub

参考

1
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
4