書くコード量をできるだけ減らしつつも、実務で使えるかもしれないと感じていただくために、イベント処理を共通化するためにクラスモジュールを使ったサンプルをご紹介しています。
クラスモジュールについて少し勉強したけれど挫折した経験のある方の中には、このサンプルをご覧になって、
「クラスってPropertyプロシージャが必要じゃないのだろうか?」
という疑問を持つ方が、いらっしゃるかもしれません。
クラスモジュールにPropertyプロシージャは必須ではない
結論から言えれば、VBAのクラスモジュールにPropertyプロシージャは必須というわけではありません。
取得も設定もできるプロパティにするならば、ご紹介したようにPublicで宣言したグローバル変数でも構いません。
ちなみにPropertyプロシージャは、クラスモジュールでしか使えないというわけでもありません。
実務で使えそうで簡単な具体例としては、thomさんのブログ記事「VBA マクロ高速化のために停止すべき3項目」で紹介されているPropertyプロシージャがおすすめです。
取得も設定もできるプロパティをPropertyプロシージャで定義する
もちろん先日ご紹介したクラスを、Propertyプロシージャを使って書くこともできます。
Propertyプロシージャを使ってTargetSheetプロパティを実装するなら、以下のようなコードを書きます。
Property Set TargetSheet(ByVal sh As Excel.Worksheet)
Set targetSheet_ = sh
End Property
Set TargetSheet = targetSheet_
End Property
グローバル変数を使った場合、
Public WithEvents TargetSheet As Excel.Worksheet
の1行で済んでいたのに、コードの行数は7倍と随分増えました。
に修正する必要もあります。
Propertyプロシージャでプロパティを実装したDataValidationクラス
DataValidationクラスモジュール全体は以下のようになります。
Option ExplicitPrivate WithEvents targetSheet_ As Excel.Worksheet
Property Set TargetSheet(ByVal sh As Excel.Worksheet)
Set targetSheet_ = sh
End PropertyProperty Get TargetSheet() As Excel.Worksheet
Private Sub targetSheet__Deactivate()
Set TargetSheet = targetSheet_
End Property
If targetSheet_.Range("A1").Value = "" Then
targetSheet_.Select
Range("A1").Select
MsgBox targetSheet_.Name & "シートのA1セルには必ずデータを入力してください。"
End If
End Sub
なおDataValidationクラスを利用している標準モジュール側は、修正不要です。
Private HandlSheet1 As VBAProject.DataValidation
Private HandlSheet2 As VBAProject.DataValidationSub AUTO_OPEN()
Set HandlSheet1 = New VBAProject.DataValidation
Set HandlSheet1.TargetSheet = VBAProject.Sheet1Set HandlSheet2 = New VBAProject.DataValidation
Set HandlSheet2.TargetSheet = VBAProject.Sheet2
End Sub
前回ご紹介した上記コードのままでOKです。これがクラスモジュールを使うメリットでもあります。
TargetSheetプロパティの変更内容
変更内容は以下のとおりです。
変数を、
Public WithEvents TargetSheet As Excel.Worksheet
から、
Private WithEvents targetSheet_ As Excel.Worksheet
にしています。
Publicで宣言していたのをPrivateに変更して、変数名も少し変更しています。
元々「TargetSheet」という名前だったのを、ここでは、先頭の1文字を小文字にし、末尾には「_」(アンダーバー・アンダースコア)を追加した「targetSheet_」にしています。
変数名は絶対にこの形にしなければならないというわけではありません。詳細は別記事で。(関連記事を書きました。2019-03-04)
変数をPrivateにして、他のモジュールからは操作できないようにしてしまったので、設定用のPropertyプロシージャと、
Property Set TargetSheet(ByVal sh As Excel.Worksheet)
取得用のPropertyプロシージャを、
Property Get TargetSheet() As Excel.Worksheet
新たに定義しました。
このサンプルでGetが必要なのか、という意見もあると思いますけれど、これも別記事で。(関連記事を書きました。2019-02-20)
Propertyプロシージャを使ってプロパティを真面目に実装すれば、このようにコードは増えます。
実務の中でクラスモジュールを使うのなら、Propertyプロシージャを必要とするケースが多くなるとは思いますが、一度クラスモジュールを使ってみたいという段階ならば、グローバル変数でお手軽に体験するというのも、ひとつの方略でしょう。体験してみてから、実務で使うのは、やめておこうと決定することも当然あるはずです。
グローバル変数を使って、プロパティをお手軽に実装する件については、最近Access関連書籍をよく出してらっしゃる 今村ゆうこ さんのブログ記事「ExcelVBAのクラスモジュールって何?という人向けの使い方まとめ」の「5. 制限のないプロパティ設定/取得を簡単に書く」のあたりも読んでみることをおすすめします。
最終更新日時:2019-03-04 14:47
- Newer:VBAでスライドマスターのヘッダーを設定するには?
- Older:変数名のつけ方-1行が長くなり過ぎないように
Home » エクセルマクロ・Excel VBAの使い方 » クラスにPropertyプロシージャはなくてもイイ