本ページには広告が含まれています。

Excel VBA クラス Property Setプロシージャ(Lv.8)

ExcelVBAのクラスで使うProperty Setプロシージャとは
画像はCanva「Text to Image」で生成しました

「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プロシージャ内のローカル変数が保持されます。
nameProperty Setプロシージャの名前(プロパティ名)を指定します。
referenceオブジェクトへの参照を表す変数を指定します。
As typereference のデータ型を指定します。
対応する 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行目で、各プロパティから取得した値(情報)を整形してメッセージボックスに表示します。

【実行結果】

実行して表示されたメッセージボックス

オブジェクトブラウザーで確認

オブジェクトブラウザーを開いて確認してみます。

Petプロパティをオブジェクトブラウザーを開いて確認

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プロシージャ」を使うべきです。

もう一度使い方の決まりを確認しておきます。

  • オブジェクトには「Property Setプロシージャ」を使う
  • 値には「Property Letプロシージャ」を使う

まとめ(おわりに)

以上、Excel VBAでクラスで Property Setプロシージャを使う方法でした。

くるみこ
くるみこ

クラスの8回目でした。

クラスで使うProperty Setプロシージャについては理解できましたか?
Property Letでも使えてしまうので紛らわしくなってしまいましたが

オブジェクトなら「Property Set」を使うと覚えてください(^^)

Property Letだけでいんじゃないのって少し思っちゃいました。でも、

基本ルールをしっかり理解して使い分けるようにしなければいけませんね(^^;)

くるみこ
くるみこ

次回はシートのデータからクラスを作る方法について勉強しましょう(^^)/

これまで勉強した部分の応用ですから、また復習しておいてくださいね。

わかりました。次回もよろしくお願いしますm(_ _)m

まとめと感想など

以上、Property Setプロシージャの使い方で覚えておいてほしい大事なことはこちらです。

・クラスモジュールでProperty Setプロシージャを使うと、プロパティにオブジェクトに対する参照を設定することができます。

・通常、取得するためには Property Getプロシージャを組み合わせて使います。

【Property Setプロシージャの基本的な書き方】

Property Set プロシージャ名(引数リスト As オブジェクト型名)
‘プロパティにオブジェクトの参照を設定する処理(プロパティ名=プロシージャ名)
End Property


Property Setプロシージャのメリットは、プロパティにオブジェクトの参照を設定する際に任意の処理を実行できることです。

次回は、シートのデータからクラスを作成する方法です。引き続きご覧いただければ幸いです。

Excel VBA クラスについての記事一覧

Excel VBA クラスの作成・使い方について(Lv.1)
Excel VBA クラスのプロパティ設定について(Lv.2)
Excel VBA クラスにメソッドを設定する方法(Lv.3)
Excel VBA クラスをインスタンス化する方法(Lv.4)
Excel VBA クラス Propertyプロシージャ(Lv.5)
Excel VBA クラス Property Getプロシージャ(Lv.6)
Excel VBA クラス Property Letプロシージャ(Lv.7)
Excel VBA クラス Property Setプロシージャ(Lv.8)
Excel VBA シートの表データからクラスを作成 (Lv.9)
Excel VBA クラス インスタンスをコレクション化(Lv.10)
Excel VBA クラス コンストラクタとデストラクタ(Lv.11)
Excel VBA クラス コンストラクタを利用する方法(Lv.12)
Excel VBA クラス コレクションの要素取得方法(Lv.13)
Excel VBA クラス コレクション要素の追加と削除(Lv.14)
Excel VBA クラス コレクションの内容を書き出す(Lv.15)
Excel VBA クラス UserFormで機能を操作する(Lv.16)
Excel VBA クラス コレクションの最大要素数について(Lv.17)

★★★ ランキング参加中! クリックしてね(^^)/ ★★★

スポンサーリンク

過去記事のサンプルファイルをダウンロードできます

この記事のサンプル登録はありません。記事内のコードをご利用ください。

過去の記事で使用したサンプルファイルがダウンロードできるページを設置しています
こちら(このリンク先)からご利用ください