t-hom’s diary

主にVBAネタを扱っているブログ…とも言えなくなってきたこの頃。

VBA 複数の引数をとるPropertyプロシージャ

これまで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プロシージャがオブジェクトの内部配列へのアクセサとして機能することが分かった。

当ブログは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。