「プロパティ」とは何なのか

Rangeオブジェクトの4大(?)プロパティ

Twitterで見かけたある考え方

Twitter

f:id:akashi_keirin:20180211085532j:plain

こんなツイを読んだ。自分なりに思ったことを書く。

一応引用しておくと

Rangeオブジェクトのプロパティ、CurrentRegion、Offfset、Resize、End は必須アイテム。このプロパティを組み合わせて使うと、セル範囲の操作を驚くほど簡潔に記述できる。同時にRangeオブジェクトへの理解が進むので、できれば早い段階で習得したい知識だと思う。

こんなの。

確かに、そういうところがあるかも知れん、と思うと同時に、

実はOffsetとかResizeがRangeオブジェクトの「プロパティ」だということを理解したのって、割と最近じゃね???

とも思ったのだ。

プ、プロパティ……?

Microsoft関係だとやたら目にする「プロパティ」という概念。

なんとなく「属性」ぐらいに理解していたのだけれど、そのせいでなのか、

プロパティにアクセスしてオブジェクトを取得するという言葉の意味が理解できていなかった

し、

RangeオブジェクトのOffsetプロパティとかResizeプロパティと言われてもピンと来ていなかった

わけですよ。少なくとも「Offset」と「Resize」については、長いこと「メソッド」だと思っておりました。

今にして思えば、いづれも「プロパティ」という概念への理解が不十分だったことが原因なんですよねー。

今でも正しく理解できているかどうか、不明ですがw

今一度自分なりに「プロパティ」の意味を考えてみる

今はこう考えている。

  1. 「プロパティ」は、オブジェクトの「状態」を表すものだ
  2. 「状態」は、数値や真偽値などのプリミティブなデータで表されることもあるし、Rangeなど、何らかのオブジェクトで表されることもある
  3. 「プロパティ」へのアクセスというのは、そのプロパティを持っているオブジェクトに、状態を問い合わせることだ
  4. プロパティがオブジェクトで表される性質のものならば、プロパティへのアクセスの結果としてオブジェクトを受け取ることとなる

だいたいこんな感じだろうか。

たとえば、

ActiveSheet.Range("A1").Offset(1, 2)

だったら、

A1セルを1行下に、2列右にずらして移動したセルの状態

なので、要するにC2セルという状態ということ(1.、2.より)。

上の例だと、Worksheet.RangeオブジェクトのOffsetプロパティにアクセスしているので、「ActiveSheet.Range("A1").Offset(1, 2)」全体がC2セルオブジェクト(という状態)を表していることになる。

「A1セルの1行下、2列右ってどんな状態やねん!」という問い合わせ(アクセス)に対して、「C2セルじゃぼけー!」全身で答えているようなもんだな。(3.、4.より)

問い合わせに対して答えてくれる、ということは、値なりオブジェクトなり(この例の場合はRangeオブジェクト)を「返してくれる」ということ、見方を変えれば「取得できる」ということでもある。だから、

Dim hoge As Range
Set hoge = ActiveSheet.Range("A1").Offset(1, 2)

なら、アクティブシートのA1セルの「1行下、2列右の状態」を問い合わせ、返ってきた「C2セルという状態(を表すRangeオブジェクト)」をRange型の変数hogeにぶち込んでいることになる。

同じように、

ActiveSheet.Range("A1").Resize(2, 3)

だと、

A1セルよ! 汝を下方向に2行分、右方向に3列分のサイズにした状態とは何ぞや!?

というアクセス(問い合わせ)に対して、A1セルが

はっ。A1:C2のセル範囲(Rangeオブジェクト)にござりまする。

とか全身で答えているのだと思えば、何か微笑ましいよね。

これも当然、

Dim hoge As Range
Set hoge = ActiveSheet.Range("A1").Resize(2, 3)

だと、A1~C2のタテ2×ヨコ3セル分のセル範囲(Rangeオブジェクト)がRange型の変数hogeにぶち込まれることになる。

おわりに

まあ、「プロパティ」という概念が、プログラミング的にはちょっと特殊なものなんですよね。

Javaで言うところの「getter・setterメソッド」みたいなもんですからね。

だから、実は「プロパティ」ってのはメソッドの一種だと考えた方が良いんだと思います。オブジェクト自身にまつわる値とかオブジェクトを返す特殊なメソッドみたいな感じかな。

その辺は、VBA界隈ではお馴染みの thom (id:t-hom) さんによる

コチラ

の記事が面白くてオススメです。