ちょっと踏み込んで勉強すると、知らないことがたくさん!
Rangeオブジェクトの既定のプロパティは[_Default]
Rangeオブジェクトのプロパティはたくさんありますが、既定のプロパティは[_Default]だったってこと。
Valueプロパティは省略できるので、Valueプロパティが既定かと勘違いしやすいので注意が必要ということです。
この件で、かなり頭を悩ませたので、備忘録。
以下ネット検索で得た知識のまとめ。
「Range の既定のメンバーは、パラメーターなしの呼び出しを Value プロパティに転送し、パラメーター付きの呼び出しを Item メンバーに転送します。」
(Microsoft docs リファレンスの記述より)
ちなみにデフォルト(既定)プロパティとは、オブジェクトを記述するだけで参照できるプロパティのこと。
ここで言うRangeとはRangeオブジェクトのことで、Range(”A1”)などの、セルを返すプロパティとは異なります。
Rangeオブジェクトとは、セル、行、列、連続した1つ以上のセルブロックを含むセルの選択、または3D範囲(複数ブックをまたいだセル参照)を選択します。Rangeプロパティ、Cellsプロパティ、Rowsプロパティ、Columnsプロパティ、Offsetプロパティなどで指定します。
RangeオブジェクトとRangeプロパティが混同して・・・ここを突き抜けるのにかなり時間を要しました。😢
以下、Rangeオブジェクトのメンバー「Rangeプロパティ」と「Cellsプロパティ」で検証してみました。
次のプロシージャの(4)以外はすべて指定したセルに値を設定できます。
Sub オブジェクト2() | ||
Cells.ClearContents | ||
(1) | Range(“A1”) = 10 | ‘セル【A1】に10を設定(簡略記述) |
(2) | Range(“A2”).[_Default] =20 | ‘①の正式な記述 |
(3) | Range(“A3”).Value = 30 | ‘Valueを明示的に記述 |
(4) | ‘ Range(“A3”).[_Default].Value = 30 | ‘この記述はエラーになる |
(5) | Cells(1, 2) = 100 | ‘セル【B2】に100を設定(簡略記述) |
(6) | Cells.[_Default](2, 2) = 200 | ‘⑤の正式な記述 |
(7) | Cells(3, 2).Value = 300 | ‘Valueを明示的に記述 |
(8) | Cells.[_Default](4, 2).Value = 400 | ‘⑦を正式に、Valueを明示して記述 |
(9) | Cells.Item(5, 2) = 500 | ‘Itemを明示して記述 |
(10) | Cells.Item(6, 2).Value = 600 | ‘Item とValueを明示して記述 |
End Sub |
結果
最初の方で触れたOfficeのリファレンスからの記述
「パラメーター付きの呼び出しを Item メンバーに転送します。」
というのはCells(5,2)など引数を指定する場合は[_Default]はItemに転送される、という意味なのですね。(5,2)はCellsの引数ではなくて [_Default]プロパティの引数ということらしい。
Rangeプロパティ
今まで使っていた入門書ではRangeプロパティの構文は「Range(”セル番地”)」と記載されていて、セルやセル範囲を扱うことから脱することができませんでした。
そこで正式な構文
式.Range (Cell1, Cell2)
Range(“A1”)はRangeプロパティのCell1引数に文字列「A1」が指定されている。
名前付き引数を使うと Range(Cell1:=”A1″)と記述することができる。
A1からH3の連続したセル範囲を指定する式 Range (”A1”,”H3”)の「H3」は引数Cell2になる。
名前付き引数を使うとRange(Cell1:=”A1″, Cell2:=”H3″)と記述できる。
セル範囲を引数一つだけで表すとRange(”A1:H3”)
名前付き引数を使うとRange(Cell1:= ”A1:H3”)
ということが判明。
さらにRangeプロパティでは相対的な位置を返すこともできます。
入門テキストで、「相対的なセルの位置を表すにはCellsプロパティを使う」とありますが、Rangeプロパティでも相対的な位置を表すことができるのですね。
次の例では、(1)でセル範囲B2からC4を選択。(2)で選択範囲のセルA1、つまり選択範囲の左上端セルB2に100を設定しています。
Sub Range_2()
(1) Worksheets(“Sheet1”).Range(“B2:C4”).Select ’セル範囲B2からC4を選択
(2) Selection.Range(“A1”).Value = 100 ‘選択範囲の左上端セルB2に100を設定
End Sub
結果
その他
行を指定するRange(“1:1”) <1行目> | Rows(1)と同等 |
Range(“1:5”) <1から5行目> | Rows(”1:5“)と同等 |
列を指定するRange(“A:A”) <A列> | Columns(1) あるいは Columns(“A”) |
Range (”A:C”) <AからC列> | Columns(“A:C”) |
以上備忘録でした。