Word Rangeの引数指定について(Tips-9)
今回は Word の Range についてです。
名前が同じで用途も似ていますが、Excelの Range とはプログラム上まったくの別物です。
Range の引数はクイックヒントに表示されるように
Start:開始文字位置
End:終了文字位置
で指定します。
下のサンプルで実際にどのような範囲になるのか、Selectメソッドで確認してみましょう。
引数指定なしの場合
Range.Select
このように、引数を指定しなければ文書の全範囲が選択されます。言い換えれば、Range は全範囲のオブジェクトであるとも言えます。
引数(0, 0)の場合
Range(0, 0).Select
少し分かりづらいですが、文書の先頭(1文字目の左側)にカーソルが移動しました。ここが (0,0) です。
引数(0, 50)の場合
Range(0, 50).Select
文書の先頭から50文字目の右側までが選択されました。改行も1文字としてカウントするので注意が必要です。
引数(50, 110)の場合
Range(50, 110).Select
50文字目の右側から110文字目の右側までが選択されました。
引数が特定の段落のみの場合
仮に5段落目のみを選択したい場合はどうすればいいでしょうか?
5段落目の開始位置は 44 で終了位置は 55 なので以下の指定で選択できます。
Range(44, 55).Select
でも、わざわざ文字数を数えなきゃいけないの?と思いますよね。
確かにそのとおり。
この場合は下記のようにすれば、簡単に5段落目のみ選択できます。
Paragraphs(5).Range.Select
Paragraphs は段落のコレクションです。
Paragraphs(5) は文書の上から 5段落目を意味します。
なので、これは5段落目の全範囲ということです。
※改行(の次の文字)から次の改行までを段落と呼びます。
では・・・・・・、特定の段落の中の Range に引数を指定することはできるのでしょうか?
Paragraphs(5).Range(0, 5).Select
しかし、これはエラーになります。
クイックヒントから分かるように、Paragraphs 以下の Range には引数が指定できないのです。
Paragraphs に限らず、つまりこういうことです。
- Documentオブジェクト.Range ・・・・・・引数指定できる
- Documentオブジェクト.下階層オブジェクト.Range ・・・・・・引数指定できない
これはそういう仕様なので、あきらめましょう。(注:すべてのオブジェクトで確認した訳ではありません)
段落内で開始位置・終了位置を指定したい場合は、発想を変えて次のように記述すると良いでしょう。
Range(Paragraphs(5).Range.Start, Paragraphs(5).Range.Start + 5).Select
Start は Range の開始文字位置を取得するプロパティです。
ウォッチウィンドウで Paragraphs(5).Range.Start の式が返す値は 44 であることが確認できます。
5段落目の最初から最後までを次のように表現することもできます。
Range(Paragraphs(5).Range.Start, Paragraphs(5).Range.End).Select
End は Range の終了文字位置を取得するプロパティです。
ウォッチウィンドウで Paragraphs(5).Range.End の式が返す値は 55 であることが確認できます。
すなわち
- Range(Paragraphs(5).Range.Start, Paragraphs(5).Range.End)
と
- Range(44, 55)
は同義です。
2ページ目以降はどうなるの?
2ページ目、3ページ目・・・・・・がある場合はページ毎にRange(0, 0)からになるのでしょうか?
答えはノーです。
ページがどれだけ続いても、文字位置は1ページ目先頭からのカウントです。
試しに2ページ目の先頭にカーソルがある状態で Start プロパティをウォッチすると
462 でした。(ページ内の文字数やレイアウトで増減します)
文字数を超えた引数を指定すると?
改行を含めて800文字しかない文書に以下のような指定をすると
Range(999, 999).Select
エラーになります。
オブジェクトモジュールと標準モジュールに書く場合の違い
ThisDocument モジュールに記述する場合は、
ThisDocument.を省略することができます。(ThisDocument.Range)
今回のサンプルは ThisDocument モジュールに書いているので省略しています。
標準モジュールに書く場合は
必ず、ActiveDocument.Range または ThisDocument.Range のように書きます。
- ActiveDocument ・・・・・・現在アクティブな文書
- ThisDocument ・・・・・・コードが記述された文書
どの文書の Range であるかを明示する必要があり、省略するとエラーになります。
Excel の場合は省略すると ActiveSheet.Range 扱いになるのでエラーにならないのです。