これまでProperty Getは複数の引数を受け取ることができないと思っていたが、昨日Twitterで以下のご指摘をいただいた。
ということで早速実験。
まずClass1を作成して以下を記述。
Property Let Sample(A As Long, B As Long, C As Long) Debug.Print A, B, C Debug.Print "Letが呼ばれました。" End Property Property Get Sample(A As Long, B As Long) As Long Debug.Print A, B Sample = A + B Debug.Print "Getが呼ばれました。" End Property
Letで引数が3つなのに対し、Getでは2つしかない。
これは、Letの最後の引数がGetの戻り値に対応するためだ。
Propertyプロシージャはふつうプライベート変数に間接的にアクセスするための「アクセサ」として用いるが、今回はとりあえずただのプロシージャとして使う。
↓以下を読んでいただくと意味が分かるかと。
thom.hateblo.jp
次に標準モジュールに以下のコードを書いて実行。
Sub hoge() Dim C As Class1: Set C = New Class1 C.Sample(10, 20) = 30 Debug.Print C.Sample(10, 30) End Sub
するとイミディエイトウインドウにこのように出力された。
10 20 30 Letが呼ばれました。 10 30 Getが呼ばれました。 40
ということで、実際に検証したところ複数の引数をとれないと思っていたのは私の勘違いだったようだ。
いみひとさんありがとうございます!
ではこれを使ってもう少し実用的なクラス内部の配列へのアクセスをやってみようと思う。
Class1をこのように書き換える。
Private Arr(1 To 9, 1 To 9) As Long Property Let Values(x As Long, y As Long, value As Long) Arr(x, y) = value End Property Property Get Values(x As Long, y As Long) As Long Values = Arr(x, y) End Property
標準モジュールには以下のコードを記述。
Sub 九九() Dim C As Class1: Set C = New Class1 '作成処理 Dim i As Long, j As Long For i = 1 To 9 For j = 1 To 9 C.Values(i, j) = i * j 'Letが呼ばれる Next Next '表示処理 Dim k As Long, l As Long For k = 1 To 9 For l = 1 To 9 Debug.Print C.Values(k, l); 'Getが呼ばれる Next Debug.Print Next End Sub
ただの九九なので普通はこんなややこしいことしないけど、まあそこはサンプルということで。
これでちゃんと複数の引数をとるPropertyプロシージャがオブジェクトの内部配列へのアクセサとして機能することが分かった。