VBA入門
Property {Get|Let|Set} ステートメント

ExcelマクロVBAの基本と応用、エクセルVBAの初級・初心者向け解説
最終更新日:2021-03-31

第140回.Property {Get|Let|Set} ステートメント


VBAでは、カスタム プロパティの作成と操作ができます。
クラス モジュール、フォーム、標準モジュール、これらにカスタム プロパティを作成することができます。
プロパティを作成するには、Property {Get|Let|Set} ステートメントを使用します。
SubやFunctionと同じようにPropertyプロシージャと呼びます。
Propertyプロシージャは、プロシージャを含むモジュールのプロパティになります。


そもそもプロパティとは

そもそもプロパティとは何か、これについて簡単に説明しておきます。
propertyは、財産・資産・性質・属性と訳されます。
オブジェクトの持つ属性を表すデータになります。
プロパティは、値の取得と、値の設定、この二つの機能があります。

セルの持つ値や書式は、これらは全てセルのプロパティです。
Rangeオブジェクトのプロパティ一覧
・Excel2010までのRangeオブジェクトのプロパティ一覧 ・Excel2016で追加されたRangeオブジェクトのプロパティ一覧 ・スピルにより追加されたRangeオブジェクトのプロパティ一覧
VBAで記述している多くの部分はプロパティになります。
オブジェクトとプロパティの真実
オブジェクトとプロパティについて、解説をします。対象は、VBA中級以上になると思いますが、初級の方でも、VBAって奥が深いんだなーと感動位は出来ると思います。(笑) ただし、あまり役には立たないかもしれませんので、あしからず。

VBAでプロパティを作成するステートメント

VBAでは、以下の3種類のステートメントが用意されています。

Property Get

プロパティの値を取得するプロシージャです。
取得とは、クラスを使う側(例えばオブジェクトを使う標準モジュールのプロシージャ)から見て取得ということです。
変数 = Range("A1").Value
このValueプロパティがGetです。

Property Let

プロパティの値を設定するプロシージャです。
設定とは、クラスを使う側(例えばオブジェクトを使う標準モジュールのプロシージャ)から見て設定ということです。
Range("A1").Value = 100
このValueプロパティがLetです。

Property Set

プロパティのオブジェクトを設定するプロシージャです。
オブジェクトの場合は、Letではなく、Setになります。
ただし、オブジェクトを扱う場合でも、Letを使用しても問題なく動作します。
Property SetはProperty Letでも同じ
・VBAでプロパティを作成するステートメント ・オブジェクトならLetとSetのどちらでも良い ・実行結果 ・Getは適宜SetとSetを使い分ける必要があります ・PropertyのSetはLetでも良いの最後に

Get、Let、Setは同一プロシージャ名を使う事が出来ます。
通常は、GetとLetまたはGetとSetを同一名にしてペアで作成します。
つまり、値の設定と取得を同じプロパティ名にすることで使いやすくできるという事です。
RangeのValueプロパティには、GetとSetがあるので、設定と取得が同じValueで使えています。

読み取り専用プロパティ

Getプロパティのみのプロパティになります。
RangeのAddressプロパティは設定できません。
つまりGetのみの読み取り専用プロパティということです。
読み取り専用プロパティなので、値を設定することはできません。

書き込み専用プロパティ

LetまたはSetだけのプロパティになります。
書き込み専用のプロパティなので、値を代入(=代入式の左辺に)することはできません。
書き込み専用プロパティを作成することはできますが、実際に使われることは滅多にありません。

Property {Get|Let|Set} ステートメントの構文

Property Get

[ Public | Private | Friend ] [ Static ] Property Get name [ (arglist) ] [ As type ]
[ statements ]
[ name = expression ]
[ Exit Property ]
[ statements ]
[ name = expression ]
End Property

Property Let

[ Public | Private | Friend ] [ Static ] Property Let name ( [ arglist ], value )
[ statements ]
[ Exit Property ]
[ statements ]
End Property

Property Set

[ Public | Private | Friend ] [ Static ] Property Set name ( [ arglist ], reference )
[ statements ]
[ Exit Property ]
[ statements ]
End Property


構文 説明
Public 省略可能。
このPropertyプロシージャは、すべてのモジュールにある他のすべてのプロシージャからアクセスできることを示します。
Option Privateステートメントを含むモジュールで使用されている場合、このプロシージャはプロジェクトの外部では使用できなくなります。
Private 省略可能。
このPropertyプロシージャは、このプロシージャが宣言されたモジュール内にある他のプロシージャからのみアクセスできることを示します。
Friend 省略可能。
クラス モジュール内でのみ使用します。
このPropertyプロシージャは、プロジェクト全体で参照可能ですが、オブジェクトのインスタンスのコントローラーからは参照できません。
Static 省略可能。
このPropertyプロシージャのローカル変数が呼び出し間で保持されることを示します。
このPropertyプロシージャの外側で宣言された変数は、このプロシージャ内で使用されていても、Static属性の影響を受けません。
name 必須です。
このPropertyプロシージャの名前です。
標準の名前付け規則に従ってください。
ただし、同じモジュール内にあるProperty Getプロシージャ、Property Letプロシージャ、Property Setプロシージャは同じ名前にすることができます。
arglist 必須。
このPropertyプロシージャの呼び出し時に渡される引数を表す変数のリストです。
複数の引数は、コンマで区切られます。
value 必須。
プロパティに割り当てる値またはオブジェクト参照を格納している変数です。
プロシージャの呼び出し時に、この引数は呼び出し元の式の右辺に置きます。
valueのデータ型は、対応するProperty Getプロシージャの戻り値の型と同じにする必要があります。
reference 必須。
オブジェクト参照の割り当ての右辺で使用されるオブジェクト参照を格納している変数です

arglist引数の構文と指定項目

[ Optional ] [ ByVal | ByRef ] [ ParamArray ] varname [ ( ) ] [ As type ] [ = defaultvalue ]

引数の詳細については以下を参照してください。
第107回.プロシージャの引数
・引数の構文 ・引数の使用例 ・引数について
ただし、Property Let|Set式の右辺にはOptionalは指定できません。

Property Let|Setプロシージャの各引数のデータ型は、対応するProperty Getプロシージャの引数と同じデータ型にする必要があります。
VBA マクロ Property


Property {Get|Let|Set} ステートメントの解説と注意点

Property Set|Letプロシージャは、プロパティの代入式(Let ステートメント)の左辺でしか使用できません。
roperty Set|Let ステートメントでは、引数を少なくとも1つ定義する必要があります。

Public、Private、、Friendを省略した場合は、Propertyプロシージャは既定のPublicになります。
Staticが使用されていない場合、ローカル変数の値は呼び出し間で保持されません。
Propertyプロシージャは、別のPropertyプロシージャ、Subプロシージャ、Functionプロシージャの内側で定義することはできません。

Exit Property
Exit Propertyステートメントにより、Propertyプロシージャは即時終了します。
プログラムの実行は、そのPropertyプロシージャを呼び出したステートメントの次のステートメントから続行されます。
Exit Propertyステートメントは、Propertyプロシージャ内の任意の場所にいくつでも配置できます。

Friendキーワード
クラス モジュールでのみ使用できます。
ただし、Friendプロシージャは、プロジェクトに含まれるどのモジュール内のプロシージャからでもアクセスできます。 Friendプロシージャは、その親クラスのタイプ ライブラリには表示されません。
また、Friendプロシージャは、遅延バインディングもできません。

Propertyプロシージャの使用例

シートモジュール:最終行を取得するプロパティ

Property Get LastRow(ByVal argCol As Long) As Long
  LastRow = Me.Cells(Me.Rows.Count, argCol).End(xlUp).Row
End Property

シートモジュールで使用します。
シートモジュール内では、自身のシートオブジェクトをMeで参照できます。

シートモジュール:名前を設定/取得します。

Property Get Name2() As String
  Me.Name2 = LCase(Me.Name)
End Property

Property Let Name2(ByVal argName As String)
  Me.Name = argName
End Property

本来のNmaeプロティとは別にName2プロパティを作成しています。
取得/設定する時に、LCaseで大文字変換しています。

上記では、シートモジュールでの使用例を掲載しましたが、Propertyが最も多く使われるのはクラスになるでしょう。
クラスでの使用例は、以下を参照してください。

Propertyプロシージャの実践例

VBAクラス入門:クラスとは?オブジェクト指向とは?
・オブジェクトとは ・オブジェクト指向とは ・カプセル化 ・オブジェクト指向とカプセル化とクラス ・クラスの必要性と利点 ・一般的なクラスに関する説明 ・クラスの比喩的説明 ・クラスの使い方 ・クラスを体験してみる ・クラスの使用例 ・クラス入門の最後に
クラスを使った全ブック(他ブック)のイベント補足
・WithEventsキーワード ・全体の機能と構成 ・VBAコード ・VBAコードの解説 ・標準モジュールでのクラスの使い方 ・アプリケーションのイベント一覧と調べ方 ・最後に
VBAクラスの作り方:列名の入力支援と列移動対応
・列挙体を使った列名表示の例 ・構造体を使った列名表示の例 ・クラスに関する基本のおさらい ・全体の機能と構成 ・シートに名前定義を設定 ・クラスを新規挿入 ・クラスに列数取得のプロシージャーと対象シートを受け取るプロパティを作成 ・クラスに列名のプロパティを作成 ・クラスの完成コード ・最後に
VBAクラスの作り方:列名のプロパティを自動作成する
・前回のVBAクラスの完成コード ・全体の機能と構成 ・クラスで、列名の入力支援と列移動対応するための手順 ・作成済のクラス(clsColumn)をエクスポートして雛形にする ・シートの列タイトルからクラスファイル(.cls)を出力 ・クラスファイル(.cls)のインポート ・全てを連続実行できるように変更 ・列番号のプロパティを自動作成するVBAの完成コード ・最後に
VBAクラスの作り方:独自Rangeっぽいものを作ってみた
・クラスの全VBAコード ・サンプルとして使うブックの構成 ・標準モジュールでの使い方 ・最後に
クラスを使って他ブックのイベントを補足する
・WithEventsキーワード ・全体の機能と構成 ・VBAコード ・VBAコードの解説 ・標準モジュールでのクラスの使い方 ・アプリケーションのイベント一覧と調べ方 ・最後に
クラスとイベントとマルチプロセス並列処理
・クラスとイベントとマルチプロセス並列処理の概要 ・VBAの全コード ・まとめと感想 ・最後に
オートフィルタを退避回復するVBAクラス
・オートフィルターに関するページ ・オートフィルターを退避回復するVBAクラスの概要 ・オートフィルターを退避し回復するクラスのVBAコード ・クラスを利用する標準モジュールのVBAコード ・処理の要点と解説 ・最後に
オートフィルタ退避回復クラスを複数シート対応させるVBAクラス
・オートフィルタ退避回復クラスを複数シート対応させるVBAクラスのコード ・クラスを利用する標準モジュールのVBAコード ・最後に
コレクション(Collection)の並べ替え(Sort)に対応するクラス
・コレクション(Collection)の並べ替え(Sort)に対応する方法 ・コレクションの並べ替えに対応するクラスのVBAコード ・コレクションの並べ替えに対応するクラスの使い方 ・コレクションの並べ替えに対応するクラスの実行時間 ・最後に



同じテーマ「マクロVBA入門」の記事

第125回.Worksheetのイベントプロシージャー
第130回.テーブル操作の概要(ListObject)
第131回.テーブル操作のVBAコード(ListObject,DataBodyRange)
第142回.テーブル全件処理とデータ最終行(ListObject,DataBodyRange)
第127回.他のブックのマクロを実行(Runメソッド)
第128回.マクロをショートカットで起動(OnKeyメソッド)
第129回.レジストリの操作(SaveSetting,GetSetting,GetAllSettings,DeleteSetting)
第133回.引数の数を可変にできるパラメーター配列(ParamArray)
第134回.Errオブジェクトとユーザー定義エラー
第138回.外部ライブラリ(ActiveXオブジェクト)
第140回.Property {Get|Let|Set} ステートメント


新着記事NEW ・・・新着記事一覧を見る

抜けている数値を探せ|エクセル雑感(2022-07-01)
.Net FrameworkのSystem.Collectionsを利用|VBA技術解説(2022-06-29)
迷路ネコが影分身の術を体得したら…|エクセル雑感(2022-06-27)
迷路にネコが挑戦したら、どうなるかな…|エクセル雑感(2022-06-26)
サロゲートペアに対応した自作関数(Len,Left,Mid,Right)|エクセル雑感(2022-06-24)
「マクロの登録」で登録できないプロシージャーは?|エクセル雑感(2022-06-23)
オブジェクトのByRef、ByVal、Variant|エクセル雑感(2022-06-22)
コメントから特定形式の年月を取り出す|エクセル雑感(2022-06-19)
4,9を使わない連番作成|エクセル雑感(2022-06-17)
連番を折り返して出力|エクセル雑感(2022-06-16)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
6.Excelショートカットキー一覧|Excelリファレンス
7.マクロって何?VBAって何?|VBA入門
8.並べ替え(Sort)|VBA入門
9.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
10.エクセルVBAでのシート指定方法|VBA技術解説




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ