VBAの勉強を始めてみた

色々試しています。

Word Rangeの引数指定について(Tips-9)

今回は Word の Range についてです。

名前が同じで用途も似ていますが、Excelの Range とはプログラム上まったくの別物です。

 

Range の引数はクイックヒントに表示されるように

f:id:kouten0430:20181207173353j:plain

Start:開始文字位置
End:終了文字位置

で指定します。

 

下のサンプルで実際にどのような範囲になるのか、Selectメソッドで確認してみましょう。

f:id:kouten0430:20181207173516j:plain

引数指定なしの場合

Range.Select

f:id:kouten0430:20181207173908j:plain

このように、引数を指定しなければ文書の全範囲が選択されます。言い換えれば、Range は全範囲のオブジェクトであるとも言えます。

 

引数(0, 0)の場合

Range(0, 0).Select

f:id:kouten0430:20181207174057j:plain

少し分かりづらいですが、文書の先頭(1文字目の左側)にカーソルが移動しました。ここが (0,0) です。

 

引数(0, 50)の場合

Range(0, 50).Select

f:id:kouten0430:20181207174217j:plain

文書の先頭から50文字目の右側までが選択されました。改行も1文字としてカウントするので注意が必要です。

 引数(50, 110)の場合

Range(50, 110).Select

f:id:kouten0430:20181207174407j:plain

50文字目の右側から110文字目の右側までが選択されました。

 

引数が特定の段落のみの場合

仮に5段落目のみを選択したい場合はどうすればいいでしょうか?
5段落目の開始位置は 44 で終了位置は 55 なので以下の指定で選択できます。

Range(44, 55).Select

f:id:kouten0430:20181207174642j:plain

でも、わざわざ文字数を数えなきゃいけないの?と思いますよね。

確かにそのとおり。
この場合は下記のようにすれば、簡単に5段落目のみ選択できます。

Paragraphs(5).Range.Select

f:id:kouten0430:20181207174642j:plain

Paragraphs は段落のコレクションです。
Paragraphs(5) は文書の上から 5段落目を意味します。

なので、これは5段落目の全範囲ということです。
※改行(の次の文字)から次の改行までを段落と呼びます。


では・・・・・・、特定の段落の中の Range に引数を指定することはできるのでしょうか? 

Paragraphs(5).Range(0, 5).Select

f:id:kouten0430:20181207175131j:plain

しかし、これはエラーになります。
クイックヒントから分かるように、Paragraphs 以下の Range には引数が指定できないのです。

f:id:kouten0430:20181207175216j:plain

 

Paragraphs に限らず、つまりこういうことです。

  • Documentオブジェクト.Range ・・・・・・引数指定できる
  • Documentオブジェクト.下階層オブジェクト.Range ・・・・・・引数指定できない

これはそういう仕様なので、あきらめましょう。(注:すべてのオブジェクトで確認した訳ではありません)

 

段落内で開始位置・終了位置を指定したい場合は、発想を変えて次のように記述すると良いでしょう。 

Range(Paragraphs(5).Range.Start, Paragraphs(5).Range.Start + 5).Select

f:id:kouten0430:20181207180146j:plain

Start は Range の開始文字位置を取得するプロパティです。

ウォッチウィンドウで Paragraphs(5).Range.Start の式が返す値は 44 であることが確認できます。

f:id:kouten0430:20181207180015j:plain

 

5段落目の最初から最後までを次のように表現することもできます。

Range(Paragraphs(5).Range.Start, Paragraphs(5).Range.End).Select

f:id:kouten0430:20181207180208j:plain

End は Range の終了文字位置を取得するプロパティです。

ウォッチウィンドウで Paragraphs(5).Range.End の式が返す値は 55 であることが確認できます。

f:id:kouten0430:20181207180314j:plain

すなわち

  • Range(Paragraphs(5).Range.Start, Paragraphs(5).Range.End) 

  • Range(44, 55)

は同義です。

 

2ページ目以降はどうなるの?

2ページ目、3ページ目・・・・・・がある場合はページ毎にRange(0, 0)からになるのでしょうか?
答えはノーです。
ページがどれだけ続いても、文字位置は1ページ目先頭からのカウントです。

試しに2ページ目の先頭にカーソルがある状態で Start プロパティをウォッチすると

f:id:kouten0430:20181207181709j:plain

f:id:kouten0430:20181207181728j:plain

462 でした。(ページ内の文字数やレイアウトで増減します)
 

文字数を超えた引数を指定すると?

改行を含めて800文字しかない文書に以下のような指定をすると 

Range(999, 999).Select

 f:id:kouten0430:20181207182119j:plain

 エラーになります。

 

オブジェクトモジュールと標準モジュールに書く場合の違い

ThisDocument モジュールに記述する場合は、

f:id:kouten0430:20181207184305j:plain

ThisDocument.を省略することができます。(ThisDocument.Range)

今回のサンプルは ThisDocument モジュールに書いているので省略しています。

 

標準モジュールに書く場合は

f:id:kouten0430:20181207185058j:plain

必ず、ActiveDocument.Range または ThisDocument.Range のように書きます。

  • ActiveDocument ・・・・・・現在アクティブな文書
  • ThisDocument ・・・・・・コードが記述された文書

どの文書の Range であるかを明示する必要があり、省略するとエラーになります。

f:id:kouten0430:20181207195201j:plain

 

Excel の場合は省略すると ActiveSheet.Range 扱いになるのでエラーにならないのです。