VBAにおけるPropertyプロシージャとは何か
はじめに
今回は、Propertyプロシージャについて調べていきます。
Propertyプロシージャはクラスでよく使われるらしいのですが、私はまだExcel VBAでクラスを使ったことがありません。まずはPropertyプロシージャの概念と使い方を覚えて後日、クラスの作成に生かしたいと思います。
プロシージャとは
マクロの処理や設定の手続きを行う流れをひとまとめにしたものです。 プロシージャの種類は、以下の3つです。
- Subプロシージャ
戻り値なし(戻り値が不要)の手続きをまとめたプロシージャ - Functuinプロシージャ
戻り値ありの手続きをまとめたプロシージャ(戻り値なしも可能) - Propertyプロシージャ
プロパティの作成や設定、操作を行うプロシージャ
今回はPropertyプロシージャにクローズアップします。
Propertyプロシージャの種類
Propertyプロシージャの種類は、以下の3つです。それぞれ用途が異なるので説明します。
- Property Letプロシージャ
- Property Setプロシージャ
- Property Getプロシージャ
Property Letプロシージャ
オブジェクト型以外の値を設定するプロシージャ
戻り値を返せません。
Property Setプロシージャ
オブジェクト型の参照値を設定するプロシージャ
戻り値を返せません。
Property Getプロシージャ
プロパティを取得するプロシージャ
戻り値を返せます。
(Functionプロシージャと同じです)
※Variant型はすべてのPropertyプロシージャで使用することが可能です。
Propertyプロシージャを使う
Propertyプロシージャを使って
「今日の気温を設定して、温度によって体感を回答する」
というプロシージャを作りました。
Private temperature_ As Long ' 呼び出し用のプロシージャ Sub todays_temperature() ' 今日の気温を設定する Temperature = 20 Debug.Print Experience ' 出力結果:ちょうどよい End Sub ' Property Letプロシージャで値を設定する ' 今回の場合は、変数temperature_の値をそのまま設定する Property Let Temperature(newTemperature As Long) temperature_ = newTemperature End Property ' Property Getプロシージャで値を返す ' 今回の場合は、変数temperature_の値によって、戻り値を変更する Property Get Experience() As String If temperature_ >= 30 Then Experience = "暑い" ElseIf temperature_ >= 15 Then Experience = "ちょうど良い" Else Experience = "寒い" End If End Property
Propertyプロシージャの覚え方
単純に英単語の訳だと以下のようになります。
- Let:させる
- Set:設定する
- Get:手に入れる
- Property:財産、資産、特質、特性
つまり、少し強引ですが、以下のように考えれば、それぞれの用途が見えてきます。
- Property Let/Setプロシージャは「特性に値を設定する=値は持っていない」ので、値を戻せない
- Property Getプロシージャは「特性の値を手に入れる=値を持っている」ので値を戻せる。
おまけ1・変数におけるLetとSet
変数の宣言後に変数へ値を設定します。実はこのときに、(オブジェクト型以外は)「Let」が入っているのですが、省略されています。
' 「Let」を省略する場合 Dim x As Long x = 1 ' 「Let」を省略しない場合 Dim x As Long Let x = 1
オブジェクト型の変数に値を設定するときは「Set」を設定しますが、こちらは省略不可です。
Dim rng As Range Set rng = Sheet1.Range("A1")
変数における「LetとSet」も、Propertyプロシージャにおける「LetとSet」と同じような役割ですね。
なお、変数は「値を設定する」のみなので、変数単体では戻り値は返せません。
おまけ2・ExcelのLET関数
Excelのワークシート関数で、変数を決める「LET関数」というものがあります。
以下一部抜粋します。
VBAの変数と同じように、変数を宣言して値を格納し、変数を使って計算できるようですね。
ご興味のある方は、ぜひ上のリンクから記事を読んでみてください。