「Excel VBAのクラス」について第8回目は、クラスで使うProperty Setプロシージャについてです。
前回 Property Letプロシージャの使い方について確認しました。
今回は Property Setプロシージャについて勉強しましょう (^^)
Property Set は「オブジェクトに対する参照を設定する」でしたね。
よろしくお願いしますm(_ _)m
はじめに
今回は「Property Setプロシージャ」を取り上げます。
はじめに3つの「Propertyプロシージャ」を再度確認しておきましょう。
プロシージャ | 説明 |
---|---|
Property Get | プロパティの値を返すプロシージャ |
Property Let | プロパティの値を設定するプロシージャ |
Property Set | オブジェクトに対する参照を設定するプロシージャ |
Property Setプロシージャは、プロパティの値としてオブジェクトへの参照を設定するプロシージャです。単独で使うこともできますが、通常はProperty Getプロシージャと対で使われます。
Property Getプロシージャは、プロパティの値としてオブジェクトへの参照を返します。両者を組み合わせることで、プロパティの値を読み書きすることができます。
【この記事でわかることは】
・Property Set プロシージャの使い方
Property Setプロシージャとは
Property Setは、プロパティにオブジェクトへの参照を設定するプロシージャです。プロパティの型が「Set」で代入するオブジェクトの場合は「Property Let」ではなく「Property Set」を使います。
Property Setプロシージャは、Property Setステートメントから始まり、Property Endステートメントまでの間で構成されます。
Property Setステートメントの構文
Property Setステートメントの構文は次のとおりです。
構文
[Public|Private|Friend] [Static] Property Set name(reference As type[, arglist])
※ []で囲んだものは省略可能です。[Public|Private|Friend]の指定省略なら既定のPublicです。
Property Setプロシージャの構文を簡単に示すとこんな感じです。
Property Set プロシージャ名(引数リスト As データ型)
‘プロパティにオブジェクトへの参照を設定する処理(プロパティ=プロシージャ名)
End Property
解説
指定項目 | 説明 |
---|---|
[Public] | すべてのモジュールのすべてのプロシージャから参照できます。 |
[Private] | 宣言したモジュール内でのみ参照できます。 |
[Friend] | クラスモジュールでのみ使用でき、プロジェクト全体から参照できます。 ただし、インスタンスのコントロールからは参照できません。 |
[Static] | Property Setプロシージャ内のローカル変数が保持されます。 |
name | Property Setプロシージャの名前(プロパティ名)を指定します。 |
reference | オブジェクトへの参照を表す変数を指定します。 |
As type | reference のデータ型を指定します。 対応する Property Getプロシージャに合わせる必要があります。 |
[, arglist] | 引数 reference が複数の場合に追加設定するリストを指定します。 |
arglist 引数の構文と指定項目
arglist の構文
[Optional] [ByVal|ByRef] [ParamArray] varname [( )] [As type] [=defaultvalue]
※ []で囲んだものは省略可能です。
arglist の指定項目
パーツ | 説明 |
---|---|
[Optional] | 引数が必須でないことを示します。 |
[ByVal] | 値渡しで引数が渡されることを示します。 |
[ByRef] | 参照渡しで引数が渡されることを示します。既定は ByRef です。 |
[ParamArray] | 最後の引数としてのみ使用できます。 Variant 要素の省略可能(Optional)な配列であることを示します。 ParamArrayキーワードを使用すると、任意の数の引数を指定できます。 ByVal、ByRef、または Optional と併用することはできません。 |
varname | 引数を表す変数の名前です。 |
[As type] | varname のデータ型です。 |
[defaultvalue] | 任意の定数または定数式です。 Optional のパラメーターにのみ有効です。 Object 型の場合、明示的な既定値は Nothing のみ有効です。 |
Property Setプロシージャの使用例
VBAのクラスモジュールでProperty Setプロシージャを使うと、オブジェクト参照をプロパティに設定することができます。
Property Setプロシージャは、単独で使うこともできすが、プロパティに設定した値を取得には、Property Getプロシージャを合わせて使います。
Property Setプロシージャと Property Getプロシージャは、同じプロパティ名で定義する必要があります。次のコードは、プロパティにクラスオブジェクトを代入している例です。
'クラス内変数はPrivateで宣言
Public Name As String
Private iAge As Integer
Private cPet As Class3
'年齢(Age)プロパティ取得
Public Property Get Age() As Integer
Age = iAge
End Property
'年齢(Age)プロパティ設定
Public Property Let Age(ByVal ageValue As Integer)
iAge = ageValue
End Property
'ペット(Pet)プロパティ取得
Public Property Get Pet() As Class3 'Objectから取得
Set Pet = cPet
End Property
'ペット(Pet)プロパティ設定
Public Property Set Pet(ByVal petValue As Class3) 'Object参照
Set cPet = petValue
End Property
標準モジュールのコードがこちらです。
Sub SetTest()
Dim owner As New Class3 'ownerクラスのインスタンス作成
Dim dog As New Class3 'dogクラスのインスタンス作成
owner.Name = "パパ" 'ownerの名前(プロパティ)をPublic変数Nameに代入
owner.Age = 50 'ownerの年齢(プロパティ)AgeはProperty Letで代入
dog.Name = "くるみ" 'dogクラスのPublic変数Nameに代入
dog.Age = 12 'dogクラスのAgeはProperty Letで代入
Set owner.Pet = dog 'ownerクラスのPetにProperty Setでdogクラスを代入
'メッセージに情報を表示
With owner
MsgBox "OWNER:" & .Name & "(" & .Age & "歳)" & vbCrLf _
& "ペット名:" & .Pet.Name & "(" & .Pet.Age & "歳)"
End With
End Sub
【クラスモジュールのコード解説】
・2行目、Nameプロパティ用の変数を Public で定義しています。
・3~4行目、クラス内で使用する変数「iAge」「cPet」を Privateで定義しています。
・7~9行目、Property Get Age で年齢(Age)プロパティの値を取得します。
・11~13行目、Property Let Age で変数 iAgeに(引数の)値を設定します。
・15~17行目、Property Get Pet は dogクラスから Petプロパティの値を取得します。
オブジェクトから取得する場合は、Setステートメントを使います。
・19~21行目、Property Set Pet は dogクラスの参照を設定しています。
オブジェクト参照を設定するには、Setステートメントを使う必要があります。
【標準モジュールのコード解説】
・2行目で変数「owner」にクラスをインスタンス化しています。
・3行目で変数「dog」にもクラスをインスタンス化しています。
※ 2~3行目は、次のように「:」で区切って2ステートメントを1行で書くこともできます。
Dim owner As Class3: Set owner = New Class3
Dim dog As Class3: Set dog = New Class3
・5行目、ownerクラスのNameプロパティに、Public変数「Name」にプロパティ値を直接代入して設定しています。
・6行目、ownerクラスのAgeプロパティは、Property Letプロシージャで「Age」プロパティの値を設定しています。
・8行目、dogクラスのNameプロパティに、Public変数「Name」でプロパティ値を直接代入して設定しています。
・9行目、dogクラスのAgeプロパティは、Property Letプロシージャで「Age」プロパティの値を設定しています。
・10行目、ownerクラスのPetプロパティに、Setステートメントを使ってdogクラスのインスタンス(オブジェクト)を代入しています。
・13行目は、Withステートメントで「owner」クラスをまとめて記述を省略しています。
・14行目で、各プロパティから取得した値(情報)を整形してメッセージボックスに表示します。
【実行結果】
オブジェクトブラウザーで確認
オブジェクトブラウザーを開いて確認してみます。
Property Setプロシージャの「Pet」プロパティのデータ型がクラスになっていることが確認できます。
「dogクラス」が「owner」クラスの「Pet」プロパティに代入されていることが確認できます。
Property Let で代用可能?
実は、今回使ったコード例の「Property Set」を次のように「Property Let」に替えて実行しみると同じ結果が得られます。
変更する箇所は「クラスモジュール」19行目の「Set」を「Let」に変更
'ペット(Pet)プロパティ設定
Public Property Set Pet(ByVal petValue As Class3) 'Object参照
↓
Public Property Let Pet(ByVal petValue As Class3) 'Object参照
標準モジュールの10行目の部分の「Set」キーワードを削除
'ペット(Pet)プロパティ設定
Set owner.Pet = dog 'ownerクラスのPetにProperty Setでdogクラスを代入
↓ Setキーワードは不要 ↓
owner.Pet = dog 'ownerクラスのPetにProperty Letでdogクラスを代入
Property Let を使った場合は、代入時にSetキーワードは不要です。逆にSetキーワードを付けた場合実行時エラーになります。
Property Let の使用は本来意図した動作ではない
オブジェクトのプロパティを設定するためには「Property Setプロシージャ」を使います。
しかし、「Property Letプロシージャ」を使った場合でも問題なく動作することが確認できました。
これは、VBAが内部的にオブジェクトの参照を扱っているからのようです。
でも、エラーが発生する可能性が無いとは言えません。可読性や一貫性の観点からも、オブジェクトの場合には「Property Setプロシージャ」を使うべきです。
もう一度使い方の決まりを確認しておきます。
まとめ(おわりに)
以上、Excel VBAでクラスで Property Setプロシージャを使う方法でした。
クラスの8回目でした。
クラスで使うProperty Setプロシージャについては理解できましたか?
Property Letでも使えてしまうので紛らわしくなってしまいましたが
オブジェクトなら「Property Set」を使うと覚えてください(^^)
Property Letだけでいんじゃないのって少し思っちゃいました。でも、
基本ルールをしっかり理解して使い分けるようにしなければいけませんね(^^;)
次回はシートのデータからクラスを作る方法について勉強しましょう(^^)/
これまで勉強した部分の応用ですから、また復習しておいてくださいね。
わかりました。次回もよろしくお願いしますm(_ _)m
まとめと感想など
以上、Property Setプロシージャの使い方で覚えておいてほしい大事なことはこちらです。
次回は、シートのデータからクラスを作成する方法です。引き続きご覧いただければ幸いです。
Excel VBA クラスについての記事一覧
★★★ ランキング参加中! クリックしてね(^^)/ ★★★
過去記事のサンプルファイルをダウンロードできます
この記事のサンプル登録はありません。記事内のコードをご利用ください。
過去の記事で使用したサンプルファイルがダウンロードできるページを設置しています
こちら(このリンク先)からご利用ください