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
新しいコメントの追加