VBA技術解説
PropertyのSetはLetでも良い

ExcelマクロVBAの問題点と解決策、VBAの技術的解説
公開日:2021-03-31 最終更新日:2021-03-31

PropertyのSetはLetでも良い


クラス等にプロパティを作成する場合、
Let
Set
Get
この3種類があります。


クラス モジュール、フォーム、標準モジュール、これらにプロパティを作成するには、
Property {Get|Let|Set} ステートメントを使用します。
Propertyの文法詳細については以下を参照してください。
第140回.Property {Get|Let|Set} ステートメント|VBA入門
・そもそもプロパティとは ・VBAでプロパティを作成するステートメント ・Property {Get|Let|Set} ステートメントの構文 ・Propertyプロシージャの使用例 ・Propertyプロシージャの実践例


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

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

Property Get

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

Property Let

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

Property Set

プロパティのオブジェクトを設定するプロシージャです。
オブジェクトの場合は、Letではなく、Setになります。
LetとSetは、対象が基本データ型(プリミティブ型)かオブジェクトかの違いになります。
基本データ型(プリミティブ型)の場合はLet、オブジェクトの場合はSetを使用します。
ただし、
オブジェクトを扱う場合にLetを使用しても問題なく動作します。
これが今回の主題です。


オブジェクトならLetとSetのどちらでも良い

クラスモジュール:Class1

Class1に以下のプロパティを作成します。

Property Let ws1(ws As Worksheet)
  Set pWs = ws
  Debug.Print pWs.Name
End Property

Property Set ws2(ws As Worksheet)
  Set pWs = ws
  Debug.Print pWs.Name
End Property

Worksheetを受け取るプロパティを、LetとSetの2つで作成しています。

標準モジュール

Sub test()
  Dim cls As New Class1
  Let cls.ws1 = Worksheets(1)
  Set cls.ws2 = Worksheets(2)
End Sub

これは、どちらも正しく動作します。
プロパティを使用する場合には、プロパティのLetとSetに合わせて記述すれば良いものであり、オブジェクトの場合はプロパティ自体はLetでもSetでも構いません。
もちろん、標準モジュールでの代入においてはLetは省略可能です。

プロパティのLetとSetに合わせて記述すれば良いだけという事です。

実行結果

マクロ VBA クラス プロパティ Let Set

問題なく動作しているのが分かります。


オブジェクト以外のプリミティブ型にはSetは使えません

クラスモジュール:Class1

Property Let val1(val As Variant)
  Debug.Print val
End Property

Property Set val2(val As Variant)
  Debug.Print val
End Property

型は指定せずにVariantとしました。

標準モジュール

Sub test()
  Dim cls As New Class1
  Let cls.val1 = 123
  Set cls.val2 = 234
End Sub

実行結果

マクロ VBA クラス プロパティ Let Set

オブジェクト以外のプリミティブ型にSetを記述した場合はエラーとなります。
上記では、val2はVariantなので、オブジェクトであれば普通にSetで代入できます。


Getは適宜SetとSetを使い分ける必要があります

Getで取得する変数がオブジェクトならSetを使う事になります。
ただし、そのオブジェクトがデフォルトプロパティを持っている場合は、Letでデフォルトプロパティの値を受け取る事が出来ます。

クラスモジュール:Class1

Property Get rng() As Variant
  Set rng = Range("A1")
End Property

標準モジュール

Sub test()
  Dim cls As New Class1, v1, v2
  Let v1 = cls.rng
  Set v2 = cls.rng
End Sub

実行結果

マクロ VBA クラス プロパティ Let Set

Letで代入したv1には、セル値(Valueである123)が値が入り、
Setで代入したv2には、Rangeブジェクトが入ります。


PropertyのSetはLetでも良いの最後に

今回は、オブジェクトを扱うプロパフィのLetとSetの違いについて解説しました。
プロパフィ側の記述だけの問題であり、それを使う側ではプロパティに合わせれば良いという事です。
ただし、可読性を考えた場合やはりオブジェクトの場合はSetを使うことをお勧めします。




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

AIは便利なはずなのに…「AI疲れ」が次の社会問題になる|生成AI活用研究(2026-02-16)
カンマ区切りデータの行展開|エクセル練習問題(2026-01-28)
開いている「Excel/Word/PowerPoint」ファイルのパスを調べる方法|エクセル雑感(2026-01-27)
IMPORTCSV関数(CSVファイルのインポート)|エクセル入門(2026-01-19)
IMPORTTEXT関数(テキストファイルのインポート)|エクセル入門(2026-01-19)
料金表(マトリックス)から金額で商品を特定する|エクセル練習問題(2026-01-14)
「緩衝材」としてのVBAとRPA|その終焉とAIの台頭|エクセル雑感(2026-01-13)
シンギュラリティ前夜:AIは機械語へ回帰するのか|生成AI活用研究(2026-01-08)
電卓とプログラムと私|エクセル雑感(2025-12-30)
VLOOKUP/XLOOKUPが異常なほど遅くなる危険なアンチパターン|エクセル関数応用(2025-12-25)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.日本の祝日一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.FILTER関数(範囲をフィルター処理)|エクセル入門
5.RangeとCellsの使い方|VBA入門
6.繰り返し処理(For Next)|VBA入門
7.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
8.マクロとは?VBAとは?VBAでできること|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.メッセージボックス(MsgBox関数)|VBA入門




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


記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
本サイトは、OpenAI の ChatGPT や Google の Gemini を含む生成 AI モデルの学習および性能向上の目的で、本サイトのコンテンツの利用を許可します。
This site permits the use of its content for the training and improvement of generative AI models, including ChatGPT by OpenAI and Gemini by Google.



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