新しいコメントの追加

マイクロソフト・Word(ワード)のAPI矛盾

VSTO (Visual Studio Tools for Office)で開発しているシステムのために、新しい関数をつくる必要がありました。その関数は、ドキュメントの表中で選択されているセルを処理します。しかし、関数をテストしているうちに、SelectionのRangeオブジェクト動作にはセル選択に対して矛盾があることが分かりました。

Rangeオブジェクトは普段Selectionオブジェクト自体と同様に動きます。例えば、以下の2つのコードは、両方とも選択セルの背景色を赤に変更します。

Selectionオブジェクト使用の場合:


Selection.Shading.ForegroundPatternColor = vbRed

Rangeオブジェクト使用の場合:


Dim myrange As Range
Set myrange = Selection.Range
myrange.Shading.BackgroundPatternColor = vbRed

だから、次の表を作ってbとeを含むセルを選択すれば、両方のコードのどちらでも以下の結果が得られます。

しかし、セルのコレクションに関して、RangeオブジェクトはSelectionオブジェクトと異なって、実際に選択されていないセルもコレクションに含まれてしまいます。例えば、以下の2つのコードは、結果が異なっています。

Selectionオブジェクト使用の場合:


For i = 1 To Selection.Cells.Count
Selection.Cells(i).Shading.BackgroundPatternColor = wdColorViolet
Next

Rangeオブジェクト使用の場合:


Dim myrange As Range
Set myrange = Selection.Range
For i = 1 To myrange.Cells.Count
myrange.Cells(i).Shading.BackgroundPatternColor = wdColorViolet
Next

ワードのAPIに詳しい方々が知っているように、Rangeオブジェクトを使用することは多くの場合便利ですが、今回のケースではSelectionオブジェクトを使ったほうがいいですね。

SelectionとRangeオブジェクトの違いについて詳しく知りたい方は、以下のリンクをご参照ください。

http://msdn.microsoft.com/en-us/library/aa164764(office.10).aspx

日本語

Topics: