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

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

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


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


そもそもプロパティとは

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

セルの持つ値や書式は、これらは全てセルのプロパティです。
Rangeオブジェクトのプロパティ一覧
エクセルの基本である、Rangeオブジェクトのプロパティの一覧です。太字リンク付きは、詳細解説ページ、または、応用したVBAコードがあるページにリンクしています。Excel2010までのRangeオブジェクトのプロパティ一覧 Excel2016で追加されたRangeオブジェクトのプロパティ一覧 CommentThreaded 範囲の左上隅のセルに関連付け…
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とSetは、対象が基本データ型(プリミティブ型)かオブジェクトかの違いになります。
基本データ型(プリミティブ型)の場合はLet、オブジェクトの場合はSetを使用します、

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回.プロシージャの引数
Subプロシージャー、Functionプロシージャーにおける、引数リストの指定について説明します。引数は、呼び出し先のプロシージャーに渡すデータを指定するものです。Callステートメントでプロシージャーを呼び出すときに指定する引数を、呼び出される側のプロシージャーで受け取る記述についてのVBA記述の説明になります。
ただし、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クラス入門:クラスとは?オブジェクト指向とは?
VBAを覚えて、いろいろ作りながらネットで調べたりしていると、クラスとかオブジェクト指向といった言葉に出くわします。VBEの「挿入」の一番下にある「クラスモジュール」は気になっていたかもしれません。このクラスモジュールを使ってクラスを作ります。
クラスを使った全ブック(他ブック)のイベント補足
VBAでイベントを使う場合は、通常はイベントが発生するオブジェクト(ブックやシート等)のモジュールに記載します、つまり、各ブックの中にマクロを入れなければなりません。開いている全ブックまたは、他の特定のブックのイベントを処理するには、WithEventsキーワードを付けた変数宣言を使います、クラスを使って全ブックまたは他ブックのイベントを補足する方法につ…
VBAクラスの作り方:列名の入力支援と列移動対応
クラスを使う良さとして、入力支援が使えてコーディングが楽になるという利点があります、列番号をクラスに持てば、列名が候補表示されて非常に便利です。しかし、これを実装するには、かなりの手間がかかります。つまり、クラス作成に手間をかけて、その後を楽にするということになります。
VBAクラスの作り方:列名のプロパティを自動作成する
クラスに列名のプロパティを作成することで、入力支援が使えてコーディングが楽になりますが、列数が多くなればVBAの記述量が増え、コーディングが大変になります。入力支援が使えるのは良いが、その事前準備があまりに大変ではやる気が失せてクラス作るのが面倒になってしまいます。
VBAクラスの作り方:独自Rangeっぽいものを作ってみた
クラスの作成は、標準モジュールで作成していた時とは様相が違い戸惑う部分も多いと思います、それは、初めてVBAに取り組んだ時の戸惑いと同じかもしれません。最初はとにかく慣れることが一番です、細かい文法や機能は、少し慣れてから改めて学んでも遅くはありません。
クラスを使って他ブックのイベントを補足する
VBAでイベントを使う場合は、通常はイベントが発生するオブジェクト(ブックやシート等)のモジュールに記載します、つまり、各ブックの中にマクロを入れなければなりません。開いている全ブックまたは、他の特定のブックのイベントを処理するには、WithEventsキーワードを付けた変数宣言を使います、クラスを使って全ブックまたは他ブックのイベントを補足する方法につ…
クラスとイベントとマルチプロセス並列処理
エクセルVBAではマルチスレッドによる並列処理はサポートされていません、つまり通常は順序良く直列に処理していくしかありません。しかし処理時間が多大にかかるような処理も現実には存在しているため、エクセルVBAで並列処理したいという要望も出てきます。
オートフィルタを退避回復するVBAクラス
シートにオートフィルタが適用されていて、かつ絞り込みされている場合は、VBAでは、何かと注意が必要になります。このような場合、オートフィルタを解除するか、フィルタ絞り込みをクリアして対応している事が多くなります。しかし、オートフィルタを解除したり、フィルタをクリアしてしまうと、それまでの絞り込み条件が消えてしまい、
オートフィルタ退避回復クラスを複数シート対応させるVBAクラス
シートにオートフィルタが適用されていて、かつ絞り込みされている場合は、VBAは何かと面倒になります。そこで、これに対応するために作成したものが、オートフィルタを退避回復するVBAクラス ただし、これはシートが一つしか扱えません。複数シートで使う場合は、シートごとにクラスのインスタンスを作成する必要があります。
コレクション(Collection)の並べ替え(Sort)に対応するクラス
オブジェクトを扱う事が多くなってくるとコレクション(Collectionオブジェクト)を使う機会も増えてくると思います。配列やディクショナリー(Dictionary)を使ったほうが良い場合も多くはありますが、単純にオブジェクトを保管し、順序通り(FIFO)に処理するだけなら、とても扱いやすい場合もあります。



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

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


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

「VBAで導関数を求めよ」ツイッターのお題をやってみた|エクセル雑感(2月9日)
Property {Get|Let|Set} ステートメント|VBA入門(2月9日)
フィボナッチ数列(再帰呼び出し)|VBA技術解説(2月8日)
エクセルで連立方程式を解く(MINVERSE,MMULT)|エクセル雑感(2月7日)
スピルって速いの?スピルの速度について|VBA技術解説(2月4日)
スピルでVBAの何が変わったか|VBA技術解説(2月3日)
スピルについて|エクセル入門(2月3日)
エクセルで「もういくつ寝るとお正月」|エクセル雑感(1月29日)
VBAの少数以下の演算誤差について|VBA技術解説(1月29日)
VBAで写真の撮影日時や音楽動画の長さを取得する|VBA技術解説(1月23日)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
4.マクロって何?VBAって何?|VBA入門
5.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
6.変数宣言のDimとデータ型|VBA入門
7.繰り返し処理(For Next)|VBA入門
8.セルに文字を入れるとは(Range,Value)|VBA入門
9.空白セルを正しく判定する方法(IsEmpty,IsError,HasFormula)|VBA技術解説
10.ひらがな⇔カタカナの変換|エクセル基本操作




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


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



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