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