Home » エクセルマクロ・Excel VBAの使い方 » クラスにPropertyプロシージャはなくてもイイ

クラスにPropertyプロシージャはなくてもイイ

動作検証バージョン:Windows版Excel(バージョン1901 ビルド11231.20130)

書くコード量をできるだけ減らしつつも、実務で使えるかもしれないと感じていただくために、イベント処理を共通化するためにクラスモジュールを使ったサンプルをご紹介しています。

クラスモジュールについて少し勉強したけれど挫折した経験のある方の中には、このサンプルをご覧になって、
「クラスってPropertyプロシージャが必要じゃないのだろうか?」
という疑問を持つ方が、いらっしゃるかもしれません。

[スポンサードリンク]

クラスモジュールにPropertyプロシージャは必須ではない

結論から言えれば、VBAのクラスモジュールにPropertyプロシージャは必須というわけではありません。

取得も設定もできるプロパティにするならば、ご紹介したようにPublicで宣言したグローバル変数でも構いません。

ちなみにPropertyプロシージャは、クラスモジュールでしか使えないというわけでもありません。
実務で使えそうで簡単な具体例としては、thomさんのブログ記事「VBA マクロ高速化のために停止すべき3項目」で紹介されているPropertyプロシージャがおすすめです。

取得も設定もできるプロパティをPropertyプロシージャで定義する

もちろん先日ご紹介したクラスを、Propertyプロシージャを使って書くこともできます。

Propertyプロシージャを使ってTargetSheetプロパティを実装するなら、以下のようなコードを書きます。


Private WithEvents targetSheet_ As Excel.Worksheet

Property Set TargetSheet(ByVal sh As Excel.Worksheet)
 Set targetSheet_ = sh
End Property

Property Get TargetSheet() As Excel.Worksheet
 Set TargetSheet = targetSheet_
End Property

グローバル変数を使った場合、
  Public WithEvents TargetSheet As Excel.Worksheet
の1行で済んでいたのに、コードの行数は7倍と随分増えました。

変数名を変更したので、イベントプロシージャの定義も「Private Sub TargetSheet_Deactivate()」から、


Private Sub targetSheet__Deactivate()

に修正する必要もあります。

Propertyプロシージャでプロパティを実装したDataValidationクラス

DataValidationクラスモジュール全体は以下のようになります。

Option Explicit

Private WithEvents targetSheet_ As Excel.Worksheet

Property Set TargetSheet(ByVal sh As Excel.Worksheet)
  Set targetSheet_ = sh
End Property

Property Get TargetSheet() As Excel.Worksheet
  Set TargetSheet = targetSheet_
End Property

Private Sub targetSheet__Deactivate()
  If targetSheet_.Range("A1").Value = "" Then
    targetSheet_.Select
    Range("A1").Select
    MsgBox targetSheet_.Name & "シートのA1セルには必ずデータを入力してください。"
  End If
End Sub

なおDataValidationクラスを利用している標準モジュール側は、修正不要です。これがクラスモジュールを使うメリットでもあります。

TargetSheetプロパティの変更内容

変更内容は以下のとおりです。

変数を、
  Public WithEvents TargetSheet As Excel.Worksheet
から、
  Private WithEvents targetSheet_ As Excel.Worksheet
にしています。

Publicで宣言していたのをPrivateに変更して、変数名も少し変更しています。
元々「TargetSheet」という名前だったのを、ここでは、先頭の1文字を小文字にし、末尾には「_」(アンダーバー・アンダースコア)を追加した「targetSheet_」にしています。

変数名は絶対にこの形にしなければならないというわけではありません。詳細は別記事で。

変数をPrivateにして、他のモジュールからは操作できないようにしてしまったので、設定用のPropertyプロシージャと、
  Property Set TargetSheet(ByVal sh As Excel.Worksheet)
取得用のPropertyプロシージャを、
  Property Get TargetSheet() As Excel.Worksheet
新たに定義しました。

このサンプルでGetが必要なのか、という意見もあると思いますけれど、これも別記事で。

Propertyプロシージャを使ってプロパティを真面目に実装すれば、このようにコードは増えます。

実務の中でクラスモジュールを使うのなら、Propertyプロシージャを必要とするケースが多くなるとは思いますが、一度クラスモジュールを使ってみたいという段階ならば、グローバル変数でお手軽に体験するというのも、ひとつの方略でしょう。体験してみてから、実務で使うのは、やめておこうと決定することも当然あるはずです。

グローバル変数を使って、プロパティをお手軽に実装する件については、最近Access関連書籍をよく出してらっしゃる 今村ゆうこ さんのブログ記事「ExcelVBAのクラスモジュールって何?という人向けの使い方まとめ」の「5. 制限のないプロパティ設定/取得を簡単に書く」のあたりも読んでみることをおすすめします。

最終更新日時:2019-02-15 19:12

[スポンサードリンク]

Home » エクセルマクロ・Excel VBAの使い方 » クラスにPropertyプロシージャはなくてもイイ

TrackBack:0

TrackBack URL

Home » エクセルマクロ・Excel VBAの使い方 » クラスにPropertyプロシージャはなくてもイイ

「エクセルマクロ・Excel VBAの使い方」の記事一覧

検索


Copyright © インストラクターのネタ帳 All Rights Reserved.

.