Excel技 コラム E13C001

E13C001 (Excel2000~2013)
Rangeの既定メンバとプロパティの省略


Excel.Rangeの既定メンバは非表示メンバの_Defaultプロパティです。Item及びValueプロパティではありません。

_Defaultプロパティの宣言
Property _Default([RowIndex], [ColumnIndex])
  Excel.Range の既定メンバ

型の表記がないので Variantです。
返されるデータ型は実行時まで分からないのでメンバリストは表示されません。

RowIndexとColumnIndexを省略した場合、Range("a1:c3").[_Default]()となります。
省略してRange("a1:c3").[_Default]、或いはRange("a1:c3")()となり、結果としてValueプロパティと同意になります。
故にRange("a1:c3").[_Default]() は Range("a1:c3").Value と表す事が出来ます。

重要Excel.Rangeクラスの既定メンバ_Defaultプロパティは、引数を指定すればItemプロパティの処理を、引数を指定しなければValueプロパティの処理を実行します。

既定メンバは省略することができるので
Range("a1:c3").Value は Range("a1:c3")
とすることが出来るはずですが、なぜRangeの既定メンバが非表示メンバなのか?を考えると一考の余地があります。

次のexample1_e13c001~example4_e13c001のコードを実行してみて下さい。準備としてRange("d1:f3")に値を代入して置きます。
example1_e13c001、example3_e13c001は期待通りの動作をします。
example2_e13c001、example4_e13c001は期待を裏切りEmptyが代入されます。
理由について考えてみましょう。
代入(=)の右辺はプロパティを省略した場合Rangeオブジェクトそのものです。既定メンバは適用されません。
一方、代入(=)の左辺は値が代入されるものなのでRangeオブジェクトではあり得ません。既定メンバが適用されValueが指定されたのと同じになります。
単一範囲のRangeの場合、左辺は配列の値(Value)を要求しているのに右辺はRangeオブジェクトで配列では無いため無効なデータとしてEmptyが代入される仕様です。
Emptyが代入されるのは右辺のRangeオブジェクトが単一範囲(Areas.Count =1)の場合です。

Sub example1_e13c001()
  Dim r1 As Range, r2 As Range
  Set r1 = Range("a1:c3")
  Set r2 = Range("d1:f3")
  r1.Value = r2.Value 'r1にr2の値が代入される
End Sub
Sub example2_e13c001()
  Dim r1 As Range, r2 As Range
  Set r1 = Range("a1:c3")
  Set r2 = Range("d1:f3")
  r1 = r2 'r1にEmptyが代入される
End Sub
Sub example3_e13c001()
  Dim r1 As Range, r2 As Range
  Set r1 = Range("a1:c3")
  Set r2 = Range("d1:f3")
  r1 = r2.Value 'r1にr2の値が代入される
End Sub
Sub example4_e13c001()
  Dim r1 As Range, r2 As Range
  Set r1 = Range("a1:c3")
  Set r2 = Range("d1:f3")
  r1.Value = r2 'r1にEmptyが代入される
End Sub

結論としてExcel.Rangeの既定メンバの省略に付いては、代入(=)の左辺はプロパティを省略しても良く、右辺及び左辺以外(引数等)はプロパティを省略出来ないということになります。
 r1 = r2.Value
これを既定メンバを省略した書き方で
 r1 = r2()
とする事が出来ます。ちょっとおしゃれです。

Sub cool_e13c001()
  Dim r1 As Range, r2 As Range
  Set r1 = Range("a1:c3")
  Set r2 = Range("d1:f3")
  r1 = r2()
End Sub