項目
内容説明
マクロの編集
ワークシートの編集
項目
内容説明
_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の既定メンバが非表示メンバなのか?を考えると一考の余地があります。
次のrange_test1〜4のコードを実行してみて下さい。準備としてRange("d1:f3")に値を代入して置きます。
range_test1、3は期待通りの動作をします。
range_test2、4は期待を裏切りEmptyが代入されます。
理由について考えてみましょう。
代入(=)の右辺はプロパティを省略した場合Rangeオブジェクトそのものです。既定メンバは適用されません。
一方、代入(=)の左辺は値が代入されるものなのでRangeオブジェクトではあり得ません。既定メンバが適用されValueが指定されたのと同じになります。
単一範囲のRangeの場合、左辺は配列の値(Value)を要求しているのに右辺はRangeオブジェクトで配列では無いため無効なデータとしてEmptyが代入される仕様です。
注)Emptyが代入されるのは右辺のRangeオブジェクトが単一範囲(Areas.Count =1)の場合です。Excel2000以降
Option Explicit Sub range_test1() 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 range_test2() Dim r1 As Range, r2 As Range Set r1 = Range("a1:c3") Set r2 = Range("d1:f3") r1 = r2 'r1にEmptyが代入される End Sub Sub range_test3() 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 range_test4() 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の既定メンバの省略に付いては、代入(=)の左辺はプロパティを省略しても良く、右辺及び左辺以外(引数等)はプロパティを省略出来ないということになります。
Sub range_cool() Dim r1 As Range, r2 As Range Set r1 = Range("a1:c3") Set r2 = Range("d1:f3") r1 = r2() End Sub
Excel技<Excel Tips>−コラム |