【VBA】WORD文書の範囲を指定して操作する (Rangeオブジェクト)

## はじめに
WORDでVBAを使用する場合は、文書中の操作したい範囲を適切に指定しないと処理を上手く実行することができません。
ここでは、WORD VBAで文書の範囲を定義する「[Rangeオブジェクト](https://docs.microsoft.com/ja-jp/office/vba/api/word.range)」について、備忘としてまとめておきます。

＜目次＞
**1. 開始位置と終了位置を指定して範囲を取得する**
　1-1. Rangeメソッドを用いた簡素な記述
　1-2. Rangeメソッドを用いた具体例
**2. 文字列検索をして範囲を取得する**
　2-1. Selectionオブジェクトから文字列を検索する
　2-2. Rangeオブジェクトから文字列を検索する
**3. Rangeプロパティを使用して範囲を取得する**

●参考サイト：[Wordにおける構成要素とRange](http://www.dastec.org/vov/wd01/vovWD02.htm)

## 1. 開始位置と終了位置を指定して範囲を取得する
Documentオブジェクトが有する「[Rangeメソッド](https://docs.microsoft.com/ja-jp/office/vba/api/word.document.range)」というものを使用することで、開始位置と終了位置を指定した範囲の取得ができます。
具体例を見た方が早いので、サンプルコードを挙げて説明していきます。
### 1-1. Rangeメソッドを用いた簡素な記述
#####サンプルコード1-1-1：文書中の２～３文字目を赤でマーキングする例

```vb
Sub Range1()
    ActiveDocument.Range(Start:=1, End:=3).HighlightColorIndex = wdRed
End Sub
```

（実行結果）
![2020-09-22 173251.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551412/05ca7c9c-c722-5373-a1de-653447dfea63.png)
この例は文書中の２文字目から３文字目までをマーキングするだけのコードです。
記述しているコードは１行のみですが、これを先頭部分から簡単に説明しておきます。

最初の`ActiveDocument`の部分は、現在開いているファイル（[Documentオブジェクト](https://docs.microsoft.com/ja-jp/office/vba/api/word.document)）を返しています。

続く`Range(Start:=1, End:=3)`（[Rangeメソッド](https://docs.microsoft.com/ja-jp/office/vba/api/word.document.range)）では、文書の領域を開始位置、終了位置を用いて指定しています。これは、簡単に`Range(1, 3)`と書くこともできます。
２文字目から３文字目の領域を取得する場合は、次の図のように、開始位置`1`から終了位置`3`の範囲で指定することになります。
改行コードも１文字分としてカウントされますのでご注意ください。
![2020-09-22 175348.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551412/c3ae1f3a-e9e9-6af4-910a-f40b89f0bacb.png)
なお、`Range(1)`というように終了位置を省略した場合は、開始位置`1`から文書末尾までの範囲が指定されることになります。
また、このRangeメソッドはDocumentオブジェクトのみで使用できるメソッドであることをご留意ください。

最後の`HighlightColorIndex`は、Rangeオブジェクトのプロパティであり、これによりマーキングの色を指定しています。
指定方法は`.HighlightColorIndex = wdRed`という形になります。
ここでは、`wdRed`で赤色を指定していますが、その他の色については「[WdColorIndex 列挙 (Word)](https://docs.microsoft.com/ja-jp/office/vba/api/word.wdcolorindex)」を参照してください。

#####サンプルコード1-1-2：文書中の３～５文字目をカタカナに置換する例

```vb
Sub Range2()
    Dim rng As Range 'オブジェクト変数の設定
    Set rng = ActiveDocument.Range(2, 5)
    rng.Text = "ウエオ"
    Set rng = Nothing 'オブジェクトの解放
End Sub
```

（実行結果）
![2020-09-23 114757.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551412/addf9570-a0fa-81d9-5888-35e5fecf7608.png)
これは指定範囲の文字列を置換するコードです。
オブジェクト変数を使用した書き方にしているためコードは４行になっていますが、最初のマーキングの例と同様に１行（`ActiveDocument.Range(2, 5).Text = "ウエオ"`）で書くことも可能です。

サンプルコードについて簡単に説明します。
まず、１行目と２行目で、オブジェクト変数`rng`に領域を指定するオブジェクト`ActiveDocument.Range(2, 5)`を代入しています。
厳密にはオブジェクトそのものを代入しているわけではないのですが、ここでは触れません（詳しくは、[オブジェクト変数とSetステートメント](https://excel-ubara.com/excelvba1/EXCELVBA352.html)という記事を参照してください。）。
ここでは、３文字目から５文字目の領域を取得するので、Rangeオブジェクトは開始位置`2`から終了位置`5`の範囲で指定しています。

次の、３行目の`rng.Text = "ウエオ"`では、Rangeオブジェクトの[Textプロパティ](https://docs.microsoft.com/ja-jp/office/vba/api/word.range.text)を用いて文字列を変換しています。
なお、ここで、次の行に`rng.Bold = True`と追加すると、変換した文字列を太字にすることもできます（その他にも様々なプロパティがありますので、詳細は「[Range オブジェクト](https://docs.microsoft.com/ja-jp/office/vba/api/word.range)」で確認してみてください。）。

最後の４行目`Set rng = Nothing`は、作成したオブジェクトを解放するための記述です（オブジェクトの解放について詳しく知りたい方は、[「Set a = Nothing」のお話](https://www.moug.net/tech/exvba/0150027.html)という記事を参照してください。）。

### 1-2. Rangeメソッドを用いた具体例
#####サンプルコード1-2-1：文書中の数字部分を黄色でマーキングする例

```vb
Const numChr = "〇一二三四五六七八九十百千万億兆0123456789０１２３４５６７８９" '漢数字のみの判定であれば後半の算用数字は不要

Sub HighlightTest()
    Dim i As Long: i = 0 '指定しなくとも初期値は0となる
    Do While i < ActiveDocument.Content.End
        If InStr(numChr, ActiveDocument.Range(i, i + 1).Text) > 0 Then
            ActiveDocument.Range(i, i + 1).HighlightColorIndex = wdYellow
        End If
        i = i + 1
    Loop
End Sub
```

（実行結果）
![2020-09-23 140431.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551412/9cf195be-d8b0-5fbf-194f-1b6f56d28290.png)
これは、文書を先頭から１文字ずつ判定して、数字である場合に黄色のマーキングを行うコードです。
コードの実行結果を見るために漢数字が必要であることから、変換文書には法律（消費税法）を使用しています。

`Sub HighlightTest()`（プロシージャ）の２行目に出てくる`ActiveDocument.Content.End`は、文書の末尾の文字位置を取得するための記述です。
[Contentプロパティ](https://docs.microsoft.com/ja-jp/office/vba/api/word.document.content)は、メイン文書全体のRangeオブジェクトを返します。つまり、文書全体を領域として持つRangeオブジェクトが取得されることになります。
そして、[Endプロパティ](https://docs.microsoft.com/ja-jp/office/vba/api/word.range.end)は、指定範囲（Rangeオブジェクト）の末尾の文字位置を取得するプロパティです。
これらのプロパティを利用することで、文書の末尾の位置を特定しています。

３行目の`ActiveDocument.Range(i, i + 1).Text`では、文書の先頭から１文字ずつ文字を取得しています。
この文字が、冒頭に定義した`numChr`に含まれているか否かを、[InStr関数](https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/instr-function)を用いて判定しています。

#####サンプルコード1-2-2：【参考】文書中の漢数字を算用数字に変換する例

```vb
Const numChr = "〇一二三四五六七八九十百千万億兆0123456789０１２３４５６７８９"

Sub ConvNumTest()
    Dim i As Long
    Dim s As Long '数字部分のスタート位置を記録する変数
    Dim rng As Range
    Dim numFlg As Boolean: numFlg = False '数字の場合にTrueとするフラグ
    
    With ActiveDocument 'ActiveDocumentの記述を省略するステートメント
        Do While i < .Content.End
            If InStr(numChr, .Range(i, i + 1).text) > 0 Then '文字が数字であるか否かの判定
                If numFlg = False Then
                    s = i '数字が出現したスタート位置を記録
                    numFlg = True '数字部分に入ったためTrueに変更
                End If
            Else
                If numFlg = True Then 'numFlgがTrueであれば直前までが数字であったということ
                    Set rng = .Range(s, i) '数字部分のRangeを変数rngに設定
                    rng.text = ConvKan2Num(rng.text) 'ConvKan2Num関数を使って漢数字を算用数字に変換
                    i = s + Len(rng.text) '変換後の数字の末尾にiを再設定（文字数が変わるため）
                    numFlg = False
                End If
            End If
            i = i + 1
        Loop
    End With
End Sub
```
（以下は、漢数字を算用数字に変換する関数）

```vb
'漢数字（二三五四一）を単純変換する関数
Function ReplKan2Num(text As String) As Double
    Dim chinNums As Variant: chinNums = Array("〇", "一", "二", "三", "四", "五", "六", "七", "八", "九")
    Dim arabNums As Variant: arabNums = Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9")
    Dim i As Long
    For i = 0 To UBound(chinNums)
        text = Replace(text, chinNums(i), arabNums(i))
    Next i
    ReplKan2Num = Val(StrConv(text, vbNarrow)) 'vbNarrowは入力文字列が"２３５４１"という全角数字の場合に対応させるため
End Function

'15桁までの漢数字を数値変換する関数
Function ConvKan2Num(text As String, Optional digit As Long = 4) As Double
    Dim i As Long, pos As Long, posStart As Long: posStart = 1
    Dim partialValue As Double
    Dim largeNums As Variant: largeNums = IIf(digit = 4, Array("", "万", "億", "兆"), Array("", "十", "百", "千")) '大数の指定
    For i = UBound(largeNums) To 0 Step -1
        If i = 0 Then
            pos = IIf(posStart = Len(text) + 1, 0, Len(text) + 1)
        Else
            pos = InStr(text, largeNums(i))
        End If
        If pos <> 0 Then '目的の大数が無い場合は加算しない
            If pos = posStart Then '目的の大数が数字を持たない場合（ex. "二千百四十"における百の位）
                partialValue = 1
            Else
                If digit = 4 Then
                    partialValue = ConvKan2Num(Mid(text, posStart, pos - posStart), 1) '再帰処理
                Else
                    partialValue = ReplKan2Num(Mid(text, posStart, pos - posStart))
                End If
            End If
            ConvKan2Num = ConvKan2Num + partialValue * 10 ^ (digit * (i))
            posStart = pos + 1
        End If
    Next i
End Function
```

（実行結果）
![2020-09-23 151137.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551412/a99b70f9-9bda-8bb1-7e00-4c5c6e47adbe.png)
これは、文書中の漢数字を算用数字に変換するコードです。

前半部分の`Sub ConvNumTest()`（プロシージャ）では、Rangeメソッドを使用して数字部分の範囲を取得した上で、算用数字への変換処理を行っています。

後半部分の`ReplKan2Num`関数及び`ConvKan2Num`関数は、漢数字を算用数字に変換するコードです。この内容は、本記事の趣旨から離れるため説明は省略します。
変換のアルゴリズムについては[こちらの記事](https://qiita.com/t-yama-3/items/9819600cec53723472d3#1-%E5%A4%89%E6%8F%9B%E3%81%AE%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)に書いてありますので、必要に応じてご参照ください。

## 2. 文字列検索をして範囲を取得する

### 2-1. Selectionオブジェクトから文字列を検索する
Selectionオブジェクトは選択範囲を表すオブジェクトです。
このSelectionオブジェクトのFindプロパティ（検索機能）を使って、対象文字列を選択して処理する例を挙げていきます。
#####サンプルコード2-1-1：文字列を１つだけ検索してマーキングする例（Selection）
```vb
Sub FindBySelection1()
    Selection.Find.Execute FindText:="又は"
    Selection.Range.HighlightColorIndex = wdYellow
End Sub
```
（実行結果）
![2020-09-24 012620.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551412/407f9eb3-3f45-1773-7af4-56ced53eeb12.png)
この例では、カーソル位置（選択位置）以降で最初に検索された文字列のみを選択して、黄色のマーキングをしています。

１行目の`Selection.Find.Execute FindText:="又は"`では、検索された文字列を選択するまでの処理を行っています。「"又は"」の部分を変えることで、任意の文字列の検索をすることができます。
この１行は、`Selection.Find.Execute ("又は")`と記述しても同じ処理が行われます。

この１行目を簡単に説明しますと、最初の`Selection`は、文字列の選択範囲を表す[Selectionオブジェクト](https://docs.microsoft.com/ja-jp/office/vba/api/word.selection)です。検索実行後は、選択範囲が検索文字列に移行します。
次の`Find`は、Selectionオブジェクトの[Findプロパティ](https://docs.microsoft.com/ja-jp/office/vba/api/word.selection.find)です。これにより「Selectionオブジェクトを介した[Findオブジェクト](https://docs.microsoft.com/ja-jp/office/vba/api/word.find)」が取得されます。このFindオブジェクトに検索条件を設定して検索を実行することになります。
次の`Execute`は、Findオブジェクトの条件に従って検索を実行する[Executeメソッド](https://docs.microsoft.com/ja-jp/office/vba/api/word.find.execute)です。
最後の`FindText:="又は"`では、検索する文字列として「又は」を指定しています。

２行目の`Selection.Range.HighlightColorIndex = wdYellow`では、選択範囲のRangeオブジェクトを取得して、黄色のマーキングを行う処理を行っています。

この２行目も簡単に説明しますと、`Selection.Range`は、Selectionオブジェクトの[Rangeプロパティ](https://docs.microsoft.com/ja-jp/office/vba/api/word.selection.range)です。これにより、選択部分のRangeオブジェクトを取得しています。
続く`HighlightColorIndex`は、前述のとおり、Rangeオブジェクトのマーキングを指定するプロパティです。

#####サンプルコード2-1-2：全ての文字列を検索してマーキングする例（Selection）
```vb
Sub FindBySelection2()
    Do While Selection.Find.Execute("又は")
        Selection.Range.HighlightColorIndex = wdYellow
    Loop
End Sub
```
（実行結果）
![2020-09-24 023356.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551412/7c971437-7491-c4bc-9736-a26e3d026a83.png)
この例では、カーソル位置（選択位置）以降にある全ての文字列を検索して、黄色のマーキングをしています。

１行目の`Selection.Find.Execute("又は")`では、前例と同様に、指定した文字列「又は」を検索して選択する処理を行っています。
ここで大事なのは、Executeメソッドを実行した場合にはBoolean型（真偽型）の戻り値があることです。検索文字列があればTrueが返され、なければFalseが返されます。
この性質を利用して、戻り値がTrueである限り検索を繰り返すようにしています。
なお、Selectionオブジェクトを介したFindオブジェクトでは、検索を実行する度に選択範囲が移行します。そして、次のループではその選択範囲以降の文字列が検索されるため、このようなシンプルな記述で足りることになります。

２行目は前例と全く同じです。
SelectionオブジェクトからRangeプロパティを取得して、黄色のマーキングを指定しています。

#####サンプルコード2-1-3：全ての検索文字列を置換してマーキングする例（Selection）
SelectionオブジェクトからFindオブジェクトを取得した場合に、<font color="#dd0000">**複数の操作**</font>を実行するには注意が必要となります。
文字列に対して「置換処理」及び「マーキング処理」を実行した場合の挙動を確認するため、次の文書を例として、３パターンのコードを実行してみます。

（処理前の元文書）
![2020-09-24 114933.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551412/f8c034e0-4c62-2de9-d469-a6bde73c57d3.png)
**①正常に実行できない例**

```vb
Sub FindBySelection3_1()
    Do While Selection.Find.Execute("又は")
        Selection.Range.text = "または"
        Selection.Range.HighlightColorIndex = wdYellow
    Loop
End Sub
```
（実行結果）
![2020-09-24 113401.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551412/edc49634-6cac-5564-68cf-f47f276856a2.png)
このコードの場合、「又は」から「または」への置換は実行されていますが、黄色のマーキング処理は実行されていません。

挙動を確認しますと、まず、１行目の`Selection.Find.Execute("又は")`の実行により「又は」の部分が選択されます。
次に、２行目の`Selection.Range.text = "または"`では、置換処理は正常に行われていますが、置換処理実行後にSelectionオブジェクトによる選択が外れてしまいます（選択が外れる理由は分かりませんが、そういう仕様だと理解するしかないと思います。）。
そのため、３行目の`Selection.Range.HighlightColorIndex = wdYellow`は、どこにも反映されない結果となります。

**②正常に実行できる例**

```vb
Sub FindBySelection3_2()
    Do While Selection.Find.Execute("又は")
        Selection.Range.HighlightColorIndex = wdYellow
        Selection.Range.text = "または"
    Loop
End Sub
```
（実行結果）
![2020-09-24 113648.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551412/e9b8b3ad-5f48-fb8d-634d-abbc6deb26b1.png)
このコードの場合、「又は」から「または」への置換も、黄色のマーキング処理も正常に実行されています。

挙動を確認しますと、２行目の`Selection.Range.HighlightColorIndex = wdYellow`によるマーキング処理の実行後も、Selectionオブジェクトは「又は」を選択したままの状態を維持します。
そのため、３行目の`Selection.Range.text = "または"`による置換処理も正常に実行されています。

ただ、このコードはSelectionオブジェクトの性質に左右されるため、このような解決方法では多少の覚束無さがあります。

**③Rangeオブジェクトを変数に格納する例**

```vb
Sub FindBySelection3_3()
    Dim rng As Range
    Do While Selection.Find.Execute("又は")
        Set rng = Selection.Range '選択範囲をRangeオブジェクト変数に格納
        rng.text = "または"
        rng.HighlightColorIndex = wdYellow
    Loop
    Set rng = Nothing
End Sub
```
（実行結果）
![2020-09-24 113648.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551412/e9b8b3ad-5f48-fb8d-634d-abbc6deb26b1.png)
このコードでは、検索された文字の範囲（領域）を、一旦、オブジェクト変数`rng`に格納した上で処理を行っています。
これにより、Selectionオブジェクトの選択が外れても、影響を受けず複数の処理を実行することができます。

### 2-2. Rangeオブジェクトから文字列を検索する
Rangeオブジェクトは範囲（領域）を表すオブジェクトです。
このRangeオブジェクトのFindプロパティ（検索機能）を使って、対象文字列の範囲（領域）を取得して処理する例を挙げていきます。
#####サンプルコード2-2-1：文字列を１つだけ検索して置換する例（Range）
```vb
Sub FindByRange1()
    Dim rng As Range
    Set rng = ActiveDocument.Content '先頭から末尾までRangeを設定
    If rng.Find.Execute("又は") Then
        rng.text = "または" '置換処理
        rng.HighlightColorIndex = wdYellow 'マーキング処理
    End If
End Sub
```
（実行結果）
![2020-09-24 124012.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551412/ecd6bcc5-97b8-463d-fb75-9f22089c7ba0.png)
このコードでは、最初に検索された文字列を置換処理しています。分かりやすいように黄色のマーキングも行っています。

２行目の`Set rng = ActiveDocument.Content`では、オブジェクト変数`rng`に、現在アクティブな文書（[ActiveDocumentプロパティ](https://docs.microsoft.com/ja-jp/office/vba/api/word.application.activedocument)）の全ての領域（[Contentプロパティ](https://docs.microsoft.com/ja-jp/office/vba/api/word.document.content)）を表すオブジェクトを代入しています（正確には参照を代入）。

３行目の`rng.Find.Execute("又は")`では、**変数`rng`の持つ領域の中で**検索対象文字列「又は」の検索を実行しています。
この検索処理が正常に行われると、`rng`の持つ領域は検索された文字列「又は」の部分のみに変更されます。
なお、検索文字列が存在しなかった場合は、`rng.Find.Execute("又は")`の戻り値がFalseになるため、If文の内容は実行されません。

#####サンプルコード2-2-2：全ての文字列を検索して置換する例（Range）
```vb
Sub FindByRange2()
    Dim rng As Range
    Set rng = ActiveDocument.Range(0) '先頭から末尾までRangeを設定
    Do While rng.Find.Execute("又は")
        rng.text = "または" '置換処理
        rng.HighlightColorIndex = wdYellow 'マーキング処理
        Set rng = ActiveDocument.Range(rng.End) '検索文言の末尾以降にRangeを設定
    Loop
End Sub
```
（実行結果）
![2020-09-24 124238.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551412/d2944c88-2474-4007-694d-6cd36b2410f2.png)
この例では、該当する文字列全てを検索して置換処理をしています。

２行目の`Set rng = ActiveDocument.Range(0)`は、`Set rng = ActiveDocument.Content`を書きかえただけです。どちらも文書全体の領域が指定されています。
これは、Rangeメソッドで開始位置の`0`のみを指定して終了位置の指定を省略していることから、終了位置が自動的に文書の末尾に設定されているためです。

６行目の`Set rng = ActiveDocument.Range(rng.End)`では、次の検索処理を実行するために、`rng`の領域を「検索された範囲以降全て」に再設定しています。

#####サンプルコード2-2-3：While文を使わず全ての文字列を検索して置換する例（Range）
```vb
Sub FindByRange3()
    Dim rng As Range
    Set rng = ActiveDocument.Content
    rng.Find.Execute FindText:="又は", ReplaceWith:="または", Replace:=wdReplaceAll
    Set rng = Nothing
End Sub
```
（実行結果は「サンプルコード2-2-2」と同じであるため省略）

このコードは、Findオブジェクトの[Replacementプロパティ](https://docs.microsoft.com/ja-jp/office/vba/api/word.find.replacement)を使用した例です。
公式ドキュメントの[Findオブジェクト](https://docs.microsoft.com/ja-jp/office/vba/api/word.find)のページに掲載されている例をほぼそのまま使用しています。
このような記載をすることで、While文を使用せず、全ての文字列の変換が実行できます。

Findオブジェクトの有する様々なプロパティを使いこなせば、シンプルで効率的なコードが書けそうです（学習中です）。

## 3. Rangeプロパティを使用して範囲を取得する
先述の「2-1. Selectionオブジェクトから文字列を検索する」で確認しましたように、SelectionオブジェクトではRangeプロパティを用いることでその範囲（領域）を表すオブジェクトを取得することができました。

Rangeプロパティは多くのオブジェクト（Paragraph、Bookmark、Cellなど）で使用できますが、ここでは、Paragraphオブジェクトの例を挙げておきます。
#####サンプルコード3：段落を指定してマーキングする例

```vb
Sub Paragraphs1()
    ActiveDocument.Paragraphs(2).Range.HighlightColorIndex = wdYellow
End Sub
```
![2020-09-24 154130.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551412/493f59ee-6e13-4264-cb4b-7cc29f0d94ae.png)
この例では、段落のうち２つ目の範囲を指定してマーキング処理を行っています。

段落は、[Paragraphsコレクション](https://docs.microsoft.com/ja-jp/office/vba/api/word.paragraphs)で表されます。
このParagraphsコレクションは、[Paragraphオブジェクト](https://docs.microsoft.com/ja-jp/office/vba/api/word.paragraph)が複数集まって構成されています。
コレクションが有するParagraphオブジェクトの数は、`ActiveDocument.Paragraphs.Count`という記述で取得することができます。
コレクションのうち、一つのオブジェクトを取得するには、`Paragraphs(2)`のように段落番号を指定して取り出します。

このコードでは、`.Range`の記述により、ParagraphオブジェクトのRangeプロパティを使用して、指定段落のRangeオブジェクトを取得しています。
そして、Rangeオブジェクトの`HighlightColorIndex`プロパティを使用して、マーキング処理を実行しているということになります。

なお、２段落目のうち、２文字目と３文字目だけをマーキングするために、`.Range(1, 3)`と記述しても動作しませんのでご注意ください。
このRangeメソッドは、Rangeオブジェクトではなく[Documentオブジェクト]()において定義されているためです（公式ドキュメントの[Rangeメソッド](https://docs.microsoft.com/ja-jp/office/vba/api/word.document.range)を参照）。

## おわりに
Word文書をVBAで処理するにあたって、参考となるサイトが少ないため、自分の備忘を兼ねてまとめておきました。
何かしらの参考となれば幸いです。