Range 対象

 

Range オブジェクト

Range はドキュメント内の連続した領域を表すオブジェクトで、最初と最後の文字の位置によって定義されます。Range オブジェクトは 1 つに限定されません。同一ドキュメント内に複数の Range オブジェクトを定義できます。Range オブジェクトには、次のような特徴があります。

  • 挿入箇所のみを表す場合もあれば、一定範囲のテキストやドキュメント全体を表す場合もあります
  • 空白、タブ文字、段落記号などの印刷されない文字も含まれます。
  • 現在選択されている領域を表す場合もあれば、別の領域を表す場合もあります。
  • 動的なオブジェクトであり、生成元のコードが実行されている間のみ存在します。

範囲の末尾にテキストを挿入すると、Word は範囲を自動的に拡大して、挿入したテキストを範囲の一部に組み込みます。


ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

Range オブジェクト

Range はドキュメント内の連続した領域を表すオブジェクトで、最初と最後の文字の位置で定義して作成します。Range オブジェクトは 1 つに限定されません。同一ドキュメント内に複数の Range オブジェクトを定義できます。指定範囲の始点と終点を同じ場所に定義すると、その範囲は挿入箇所になります。また、ドキュメントの最初の文字から最後の文字までを指定して、ドキュメント全体を網羅した範囲を定義できます。範囲には、空白、タブ、段落記号など、印刷されない文字もすべて含まれます。

メモ   作成した範囲は、記述したコードが動作している間のみ機能します。

Range オブジェクトは、多数のメンバを Selection オブジェクトと共有しています。この 2 つの主な違いは、Selection オブジェクトが常にユーザー インターフェイスで選択範囲への参照を返すのに対して、Range オブジェクトはユーザー インターフェイスに範囲を表示することなくテキストを処理できることです。

Selection オブジェクトではなく Range オブジェクトを使用する主な利点は次のとおりです。

  • 一般的に言って、特定のタスクを実行する場合を比較すると、Range オブジェクトの方がコードの行数が少なくなります。
  • Range オブジェクトを使用すると、アクティブ ドキュメント内で強調表示の移動や変更を行うときの Word 関連のオーバーヘッドが発生しません。
  • 後で説明しますが、Range オブジェクトは Selection オブジェクトよりも多くの機能を備えています。

範囲の定義と選択

Document オブジェクトの Range メソッドを使用して開始値と終了値を指定することによって、ドキュメント内に範囲を定義できます。次のコードでは、アクティブ ドキュメントの最初の 7 文字 (印刷されない文字を含む) を包含する Range オブジェクトを新しく作成します。さらに、Range オブジェクトの Select メソッドを使用して、指定範囲を強調表示します。この行のコードを省略した場合、Range オブジェクトは Word のユーザー インターフェイスで選択状態になることはありませんが、プログラムで処理することはできます。

' Visual Basic
Dim rng As Word.Range = ThisDocument.Range(0, 7)
rng.Select()
// C#
Object start = 0;
Object end = 7;
Word.Range rng = ThisDocument.Range(ref start, ref end);
rng.Select();

図 9 に実行結果を示します。実行結果には段落記号と空白が含まれます。

図 9. Range オブジェクトには印刷されない文字が含まれます。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

文字数のカウント

ドキュメント内の最初の文字の位置は 0 です。これは挿入箇所を示しています。最後の文字の位置は、ドキュメント内の文字数と同じです。ドキュメント内の文字数は、Characters コレクションの Count プロパティを使用して確認できます。次のコードでは、ドキュメント全体を選択し MessageBox で文字数を表示します。

' Visual Basic
Dim rng As Word.Range = _
ThisDocument.Range(0, ThisDocument.Characters.Count)
'または
' rng = ThisDocument.Range()
rng.Select()
MessageBox.Show( _
"Characters: " & ThisDocument.Characters.Count.ToString)
// C#
Object start = Type.Missing;
Object end = Type.Missing;
Word.Range rng = ThisDocument.Range(ref start, ref end);
rng.Select();
MessageBox.Show("Characters: " + ThisDocument.Characters.Count.ToString());

ヒント   Visual Basic .NET では、パラメータを指定しないで Range
メソッドを呼び出すと範囲全体を返します。したがって、ドキュメントの内容全体を処理する場合は、開始値と終了値を指定する必要はありません。C#
の場合は、すべての省略可能なパラメータに対して必ず値を渡す必要があるため、当然この機能は適用できません。C#
では、すべての省略可能なパラメータについて Type.Missing を渡すことで既定値を使用できます。
範囲の設定

文字数に関係なくドキュメント全体を選択する場合は、Document オブジェクトの Select メソッドを Range プロパティに対して使用することができます。

' Visual Basic
ThisDocument.Range.Select()
// C#
Object start = Type.Missing;
Object end = Type.Missing;
Word.Range rng = ThisDocument.Range(ref start, ref end);
rng.Select();

必要に応じて、Document オブジェクトの Content プロパティを使用し、ドキュメントからヘッダー、フッターなどを除いた本文のみを包含する範囲を定義できます。

' Visual Basic
Dim rng As Word.Range = ThisDocument.Content
rng.Select()
// C#
Word.Range rng = ThisDocument.Content;

他のオブジェクトのメソッドとプロパティを使用して、範囲を決定することもできます。次のプロシージャのコードは、次に示すアクションを実行してアクティブ ドキュメントの 2 番目の文を選択します。(就是选择第二句话的意思)

  • Range 変数を作成する。
  • ドキュメント内に少なくとも 2 つの文が存在することを確認する。
  • Range メソッドの Start 引数を 2 番目の文の先頭に設定する。
  • Range メソッドの End 引数を 2 番目の文の末尾に設定する。
  • 範囲を選択する。
' Visual Basic
Friend Sub SelectSentence()
Dim rng As Word.Range
With ThisDocument
If .Sentences.Count >= 2 Then
' 範囲の最初と最後の値を指定します。
rng = .Range( _
CType(.Sentences(2).Start, System.Object), _
CType(.Sentences(2).End, System.Object))
' 範囲を選択します。
rng.Select()
End If
End With
End Sub
//C#
public void SelectSentence() {
Word.Range rng;
if (ThisDocument.Sentences.Count >= 2 ) {
// 範囲の最初と最後の値を指定します。
Object start = ThisDocument.Sentences[2].Start;
Object end = ThisDocument.Sentences[2].End;
rng = ThisDocument.Range(ref start, ref end);
rng.Select();
}
}

メモ    Range プロパティに渡すパラメータは System.Object として宣言されているため、これらの値を明示的に変換するようにコーディングする必要があります。Visual Basic .NET を利用していて Option Strict が オフに設定されている場合は、この操作を行う必要はありません。C# を利用している場合は、これまで説明したように、これらの値を参照で渡す必要があります。
ヒント   C# で開発する場合、 Documents コレクションの要素は隠しメソッド get_Item を使用して個別に取得する必要がありましたが、 ParagraphsSentences、およびその他のプロパティは配列を返します。したがって、C# による開発者は、これらの配列に対して他の配列と同様にインデックスを付けることができます。

2 番目の文を選択することが目的である場合は、Sentence オブジェクトに直接範囲を設定することで実現でき、コードの行数も節約できます。次のコードは、前に示したプロシージャと同様に機能します。

' Visual Basic
Dim rng As Word.Range = ThisDocument.Sentences(2)
rng.Select()
// C#
Word.Range rng = ThisDocument.Sentences[2];
rng.Select();
範囲の拡張

Range オブジェクトを定義すると、MoveStart メソッドおよび MoveEnd メソッドを使用して、現在の指定範囲を拡張できるようになります。MoveStart メソッドおよび MoveEnd メソッドにはそれぞれ、Unit と Count という 2 つの引数を指定します。Unit 引数には、次の WdUnits列挙値のいずれかを指定します。

  • wdCharacter
  • wdWord
  • wdSentence
  • wdParagraph
  • wdSection
  • wdStory
  • wdCell
  • wdColumn
  • wdRow
  • wdTable

Count 引数は、移動する単位数を指定します。次のコードでは、ドキュメント内の最初の 7 文字で構成される範囲を定義しています。さらに、Range オブジェクトの MoveStart を使用して、指定範囲の開始位置を 7 文字分移動します。指定範囲の末尾も 7 文字であるため、結果的にこの範囲は挿入箇所になります。MoveEnd メソッドを使用して、終了位置を 7 文字分移動します。

' Visual Basic
' 7 文字の範囲を定義します。
Dim rng As Word.Range = _
ThisDocument.Range(0, 7)
' 開始位置を 7 文字分移動します。
rng.MoveStart(Word.WdUnits.wdCharacter, 7)
' 終了位置を 7 文字分移動します。
rng.MoveEnd(Word.WdUnits.wdCharacter, 7)
// C#
// 7 文字の範囲を定義します。
Object start = 0;
Object end = 7;
Word.Range rng = ThisDocument.Range(ref start, ref end);
// 開始位置を 7 文字分移動します。
Object unit =
Word.WdUnits.wdCharacter;
Object count = 7;
rng.MoveStart(ref unit, ref count);
// 終了位置を 7 文字分移動します。
unit =
Word.WdUnits.wdCharacter;
count = 7;
rng.MoveEnd(ref unit, ref count);

図 10 は、コードの進行状況を示しています。1 行目は最初の指定範囲、2 行目は MoveStart メソッドによって開始位置が 7 文字分移動した後 (指定範囲は I バーで示す挿入箇所に変化)、3 行目は MoveEnd ステートメントによって範囲の終了位置が 7 文字分移動した後に選択されている文字をそれぞれ示します。

図 10. MoveStart メソッドおよび MoveEnd メソッドを使用した範囲サイズの変更

範囲内の最初と最後の文字の取得

次のコードに示すように、Range オブジェクトの Start プロパティと End プロパティを取得すると、範囲の最初と最後にある文字位置を取得できます

' Visual Basic
MessageBox.Show(String.Format( _
"Start: {0}, End: {1}", rng.Start, rng.End), _
"Range Start and End")
// C#
MessageBox.Show(String.Format("Start: {0}, End: {1}", rng.Start, rng.End), "Range Start and End");

SetRange を使用した範囲のリセット

SetRange を使用して既存の範囲のサイズを変更することもできます。次のコードでは、ドキュメント内の最初の 7 文字で始まる範囲を初期の範囲として設定します。さらに、SetRange を使用して、範囲の開始位置を 2 番目の文に、終了位置を 5 番目の文末にそれぞれ変更しています。

' Visual Basic
Dim rng As Word.Range
rng = ThisDocument.Range(0, 7)
' 既存の範囲をリセットします。
rng.SetRange( _
ThisDocument.Sentences(2).Start, _
ThisDocument.Sentences(5).End)
// C#
Word.Range rng;
Object start = 0;
Object end = 7;
rng = ThisDocument.Range(ref start, ref end);
// 既存の範囲をリセットします。
rng.SetRange(ThisDocument.Sentences[2].Start, ThisDocument.Sentences[5].End);
rng.Select();
    

テキストの書式設定

Range オブジェクトを使用してテキストの書式を設定することもできます。コード内で実行する必要があるステップは次のとおりです。

  • 書式を設定する範囲を定義する。
  • 書式設定を適用する。
  • 必要に応じて、書式を設定した範囲を選択して表示する。

次のサンプル プロシージャでは、ドキュメントの最初の段落を選択し、フォント サイズ、フォント名、配置を変更します。さらに、範囲を選択して MessageBox を表示し、一時停止してから次のコード セクションに実行を移して、Document オブジェクトの Undo メソッドを 3 回呼び出します。その次のコード ブロックでは、標準インデント スタイルを適用して MessageBox を表示し、コードの実行を一時停止します。その後、Undo メソッドを 1 回呼び出して MessageBox を表示します。

' Visual Basic
Friend Sub FormatRangeAndUndo()
' 範囲を最初の段落に設定します。
Dim rng As Word.Range = _
ThisDocument.Paragraphs(1).Range
' 書式設定を変更します。
With rng
.Font.Size = 14//一回分
.Font.Name = "Arial"//二回分
.ParagraphFormat.Alignment = _
Word.WdParagraphAlignment.wdAlignParagraphCenter//三回分
End With
rng.Select()
MessageBox.Show("Formatted Range", "FormatRangeAndUndo")
' 3 回分の操作を元に戻します。
ThisDocument.Undo(3)
rng.Select()
MessageBox.Show("Undo 3 actions", "FormatRangeAndUndo")
' 標準インデント スタイルを適用します。
rng.Style = "Normal Indent"
rng.Select()
MessageBox.Show("Normal Indent style applied", "FormatRangeAndUndo")
' 1 回分の操作を元に戻します。
ThisDocument.Undo()
rng.Select()
MessageBox.Show("Undo 1 action", "FormatRangeAndUndo")
End Sub
// C#
public void FormatRangeAndUndo() {
// 範囲を最初の段落に設定します。
Word.Range rng = ThisDocument.Paragraphs[1].Range;
// 書式設定を変更します。
rng.Font.Size = 14;
rng.Font.Name = "Arial";
rng.ParagraphFormat.Alignment =
Word.WdParagraphAlignment.wdAlignParagraphCenter;
rng.Select();
MessageBox.Show("Formatted Range", "FormatRangeAndUndo");
// 3 回分の操作を元に戻します。
Object times = 3;
ThisDocument.Undo(ref times);
rng.Select();
MessageBox.Show("Undo 3 actions", "FormatRangeAndUndo");
// 標準インデント スタイルを適用します。
Object style = "Normal Indent";
rng.set_Style(ref style);
rng.Select();
MessageBox.Show("Normal Indent style applied", "FormatRangeAndUndo");
// 1 回分の操作を元に戻します。
times = 1;
ThisDocument.Undo(ref times);
rng.Select();
MessageBox.Show("Undo 1 action", "FormatRangeAndUndo");
}
ヒント   Range.Style プロパティは Variant 型が指定されることを想定しているため、C# による開発者は、
スタイルを設定するために Range クラスの隠しメソッドである set_Style を呼び出す必要があります。
範囲に対してスタイルを適用するには、set_Style メソッドにスタイル名と Style オブジェクトのいずれかを参照によって
渡します。VBA で読み取り/書き込みのプロパティが Variant 型で定義されている場合、C# による開発者は、
set_Style
get_Style など、適切な隠しアクセサ メソッドを呼び出す必要があります。
Visual Basic .NET の場合は、プロパティの値を直接設定したり取得したりすることができます。

テキストの挿入

Range オブジェクトの Text プロパティを使用して、ドキュメント内でテキストを挿入したり置き換えたりすることができます。次のコードでは、ドキュメントの先頭を挿入箇所とする範囲を指定し、" New Text " (空白に注意) というテキストを挿入箇所に挿入します。さらに、このコードでは、挿入したテキストが含まれている Range を選択します。図 11 に、コードの実行結果を示します。

' Visual Basic
Dim str As String = "New Text"
Dim rng As Word.Range = ThisDocument.Range(0, 0)
rng.Text = str
rng.Select()
// C#
string str = "New Text";
Object start = 0;
Object end = 0;
Word.Range rng = ThisDocument.Range(ref start, ref end);
rng.Text = str;
rng.Select();

図 11. 挿入箇所への新しいテキストの挿入

範囲内のテキストの置換

設定した範囲が挿入箇所ではなく選択範囲である場合は、範囲内のすべてのテキストが挿入テキストに置換されます。次のコードでは、ドキュメント内の最初の 12 文字で構成される Range オブジェクトを作成します。その後、この文字は別の文字列に置換されます。

' Visual Basic
rng = ThisDocument.Range(0, 12)
rng.Text = str
rng.Select()
// C#
start = 0;
end = 12;
rng = ThisDocument.Range(ref start, ref end);
rng.Text = str;
rng.Select();

図 12. 新しいテキストへの既存テキストの置換

指定範囲または選択範囲の縮小

Range オブジェクトまたは Selection オブジェクトを操作する場合、選択範囲を以前の挿入箇所に変更して、既存のテキストが上書きされないようにする必要があります。Range オブジェクトおよび Selection オブジェクトには Collapse メソッドがあり、このメソッドは 2 種類の WdCollapseDirection 列挙値を使用できます。

  • WdCollapseStart : 選択範囲を先頭まで縮小します。列挙値を指定しない場合は、この値が既定値になります。
  • WdCollapseEnd : 選択範囲を先頭まで縮小します。

次のプロシージャでは、ドキュメント内の最初の段落で構成される Range オブジェクトを作成します。さらに、wdCollapseStart 列挙値を使用して範囲を縮小します。その後、新しいテキストを挿入して範囲を選択します。図 13 に、結果を示します。

' Visual Basic
Dim str As String = " New Text "
Dim rng As Word.Range = _
ThisDocument.Paragraphs(1).Range
rng.Collapse(Word.WdCollapseDirection.wdCollapseStart)
rng.Text = str
rng.Select()
// C#
string str = "New Text";
Word.Range rng = ThisDocument.Paragraphs[1].Range;
Object direction = Word.WdCollapseDirection.wdCollapseStart;
rng.Collapse(ref direction);
rng.Text = str;
rng.Select();

図 13. 段落範囲の縮小後に挿入したテキストは、段落の先頭に挿入されます。

wdCollapseEnd の値を使用すると、新しいテキストは後続の段落の先頭に挿入されます。

' Visual Basic
rng.Collapse(Word.WdCollapseDirection.wdCollapseEnd)
// C#    
Object direction = Word.WdCollapseDirection.wdCollapseEnd;
rng.Collapse(ref direction);

図 14. 段落の末尾まで縮小すると、テキストは次の段落に挿入されます。

新しい文が段落記号の前に挿入されることを想像したユーザーもいるかもしれませんが、元の範囲内に段落記号があるため、そのように動作することはありません。次の項で、テキストを安全に挿入するための段落記号の操作方法を説明します。

テキストの挿入と段落記号の処理

Range オブジェクトを段落単位で作成すると、印刷されない文字もすべて含まれることになります。次のプロシージャ例では、2 個の文字列変数を宣言し、アクティブ ドキュメントの最初と 2 番目の段落の内容を取得します。

' Visual Basic
Friend Sub ManipulateRangeText()
' 最初と 2 番目の段落の内容を取得します。
Dim str1 As String = ThisDocument.Paragraphs(1).Range.Text        
Dim str2 As String = ThisDocument.Paragraphs(2).Range.Text
// C#
public void ManipulateRangeText() {
// 最初と 2 番目の段落の内容を取得します。
string str1 = ThisDocument.Paragraphs[1].Range.Text;
string str2 = ThisDocument.Paragraphs[2].Range.Text;

次のコードでは、最初と2番目の段落で利用するために 2つの Range 変数を作成してTextプロパティを割り当て、2つの段落間でテキストを入れ替えています。さらに、各範囲を順に選択し、選択の合間MessageBox ステートメントで一時停止して結果を表示します。

図 15 に、入れ替え後のドキュメントを示します。ここでは、rng1 が選択されています。

' Visual Basic
' 段落を入れ替えます。
Dim rng1 As Word.Range = _
ThisDocument.Paragraphs(1).Range
rng1.Text = str2
Dim rng2 As Word.Range = _
ThisDocument.Paragraphs(2).Range
rng2.Text = str1
' 一時停止して結果を表示します。
rng1.Select()
MessageBox.Show(rng1.Text, "ManipulateRangeText")
rng2.Select()
MessageBox.Show(rng2.Text, "ManipulateRangeText")
// C#
// 段落を入れ替えます。

Word.Range rng1 = ThisDocument.Paragraphs[1].Range;
rng1.Text = str2;
Word.Range rng2 = ThisDocument.Paragraphs[2].Range;
rng2.Text = str1;
// 一時停止して結果を表示します。
rng1.Select();
MessageBox.Show(rng1.Text, "ManipulateRangeText");
rng2.Select();
MessageBox.Show(rng2.Text, "ManipulateRangeText");

図 15. 最初と 2 番目の段落が入れ替わり、rng1 が選択されています。

  次のコード セクションでは、MoveEnd メソッドを使用して rng1 を調整し、rng1 に段落記号が含まれないようにします。さらに、Range オブジェクトの Text プロパティに新しい文字列を割り当てて、最初の段落にある残りのテキストを置換します。

' Visual Basic
rng1.MoveEnd(Word.WdUnits.wdCharacter, -1)
' 段落 1 に新しいテキストを書き込みます。
rng1.Text = "New content for paragraph 1."
// C#
Object unit = Word.WdUnits.wdCharacter;
Object count = -1;
rng1.MoveEnd(ref unit, ref count);
// 段落 1 に新しいテキストを書き込みます。
rng1.Text = "new content for paragraph 1.";

次のコード セクションは、段落記号も含め rng2 内のテキストを置換します。

' Visual Basic
rng2.Text = "New content for paragraph 2."
// C#
rng2.Text = "new content for paragraph 2.";

さらに、rng1 を選択して一時停止し、MessageBox で結果を表示します。rng2 について同様の処理を行います。rng1 は段落記号を含まないように再定義されているため、元の段落書式は維持されます。rng2 の段落記号は新しい文で上書きされたため、段落としての機能はなくなります。

図 16 に、rng2 が強調表示されている状態を示します。rng2 は当初の 3 番目の段落に結合され、独立した段落ではなくなっています。

' Visual Basic
' 一時停止して結果を表示します。
rng1.Select()
MessageBox.Show(rng1.Text, "ManipulateRangeText")
rng2.Select()
MessageBox.Show(rng2.Text, "ManipulateRangeText")
// C#
// 一時停止して結果を表示します。
rng1.Select();
MessageBox.Show(rng1.Text, "ManipulateRangeText");
rng2.Select();    
MessageBox.Show(rng2.Text, "ManipulateRangeText");

図 16. rng2 に挿入された新しい内容によって、段落記号が上書きされました。

両方の範囲に含まれていた元の内容は String 変数として保存されているため、2 つの段落を元の順番に並べた状態にドキュメントを復元することは、それほど困難ではありません。次のコードは、MoveEnd メソッドを使用して段落記号を 1 文字分移動し、rng1 に段落記号が含まれるように再調整しています。

' Visual Basic
rng1.MoveEnd(Word.WdUnits.wdCharacter, 1)
// C#
unit = Word.WdUnits.wdCharacter;
count = 1;
rng1.MoveEnd(ref unit, ref count);

次に、rng2 全体を削除します。これで 3 番目の段落が元の位置に戻ります。

' Visual Basic
rng2.Delete()
// C#
// C# の場合は両方のパラメータを
// 指定する必要があります。範囲の長さを計算するかどうかは
// プログラマの裁量によります。
unit = Word.WdUnits.wdCharacter;
count = rng2.Characters.Count;
rng2.Delete(ref unit, ref count);

rng1 に元の段落テキストを復元します。

' Visual Basic
rng1.Text = str1
// C#
rng1.Text = str1;

最後のコード セクションでは、Range オブジェクトの InsertAfter メソッドを使用して元の 2 番目の段落の内容を rng1 の後ろに挿入し、rng1 を選択します。

図 17 に、3 つの段落を示します。ここでは、rng1 が選択されてい    ます。このとき、rng1 は挿入したテキストを含むように拡張されているため、2 番目の段落も rng1 に含まれていることに注意してください。

' Visual Basic
rng1.InsertAfter(str2)
rng1.Select()
End Sub
// C#
rng1.InsertAfter(str2);        
rng1.Select();

}

図 17. InsertAfter メソッドによって Range オブジェクトが拡張され、挿入テキストがオブジェクトに含められます。

    


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值