この記事では
- VBAのクラスモジュールの使い方を解説しています。
- 前回に引き続き、シートの情報をクラスモジュールを使ってオブジェクト化していく手法を説明しています。
- この記事はクラスモジュールの実践的な使い方を学びたい人に向けて書いています。
- シリーズものです。その1はこちら→挫折した人のためのVBAクラスモジュール入門_その1 - 適材適所。
プロパティを設定できた
前回はGodExcelオブジェクトに値を設定することに成功したのでした。
プロパティに値を設定するための定義は
Property Let~
のように定義するのでした。
これでGodExcelのレベルも少し上がりました。 LV8くらいですね。
でもまだ肝心の、プロパティの取得ができません。
今回は、プロパティの取得に焦点を当ててみます。
プロパティを取得できるようにする
プロパティの取得は、Property Getステートメントを使います。
こんな感じになります。
Public Property Get NameFurigana() As String NameFurigana = pNameFurigana End Property
プロパティの設定と似てますね。
細かく見てみると
Public:この操作は誰でもできます。
Property:これはプロパティに関する定義ですよ。
Get:取得します。
NameFurigana:呼び出すときはこの名前で呼び出してね。プロパティ名はこれです。
NameFurigana = pNameFurigana:プロパティ名に内部的なpNameFuriganaを代入します。
Letと似ています。前回も書きましたが、Property関係のステートメントは関数的なイメージに近いです。
関数的な発想でいうと、Poroerty Getは戻り値のある関数です。
内部のプロパティであるpNameFuriganaを、NameFuriganaに設定して戻り値として返している、そんなイメージが近いと思います。
これで外部からプロパティを取得することができるようになりました。
実際の呼び出し方の確認も含めて、テストしてみましょう。
Property Getをテストする
前回までのGodExcelクラスに追加してみます。
'プロパティ Dim pNameFurigana As String Public Property Let NameFurigana(aNameFurigana As String) pNameFurigana = aNameFurigana End Property '新たに追加 Public Property Get NameFurigana() As String NameFurigana = pNameFurigana End Property
標準モジュールも前回のものに追加してみます。
Sub sample() Dim god As GodExcel Set god = New GodExcel god.NameFurigana = "かみえくせる" Debug.Print god.NameFurigana End Sub
追加したのは次の一行です。
Debug.Print god.NameFurigana
実際の呼び出しはこのようにします。
標準モジュールから見ると、godのプロパティはNameFuriganaのように見えますね。
sampleを実行してみると、イミディエイトウィンドウに「かみえくせる」と表示されるかと思います。
これでプロパティを取得することができました!!
大分レベルアップしましたね、God。Lv10くらいでしょうか。
しかし、プロパティを設定したり、取得したりするのも大変です。
なぜ、このように面倒なことになるのでしょうか。
なぜオブジェクト内部のプロパティを外部から直接いじれないようにするのか
結論から言うと、外部から直接いじれるようにすることもできるんです。
ただPrivate pNameFurigana as StringのPrivateをPublicに書き換えちゃえば。
そうすれば、2回に渡って紹介した、Property LetやGetは必要ないんです。
そして、そこまで大規模なものでなければ、それでも十分だったりします。
「おおい!!じゃあなんで、こんな面倒なことやるねん!!(;^ω^)」
そう思いますよね。
どうしてPrivateにして、プロパティへのアクセスを制限するのか。
一般的に言われるメリットはこんな感じでしょうか。
- カプセル化する
- プロパティのインターフェースを統一する
うーん、横文字の意味が伝わってこない・・・。
多分、今の日本って外来語がそのままカタカナになって入ってくるようになっちゃったじゃないですか。
明治時代くらいはそうではなくて、知識人たちが、うまーい意訳を考えて、漢字にして、庶民に紹介してくれた。
例えば硝子とか、電話とか・・・。でも今は意訳が全くなく、そのまま入ってくるので、とっかかりがないんですよね。
カプセル化や、インターフェースとか言われても、ピンとこない。
私だけでしょうか??
おっと、めっちゃ話が逸れてしまいました・・・。
これからクラスモジュールについて学ぼうとしている人にとって、この何とも実態をつかみ難い横文字は関門の一つかも知れません。
そして私もそこまで理解できているかというと微妙なところ・・・。
でもここを語らずして逃げてしまっては、なぜ面倒なProperty〇〇なんて使うんだ!!という疑問に答えることができません。
また、クラスモジュールのメリットを知ってもらうことができません。
私なりの解釈でこの辺りについて説明してみたいと思います。が、ちょっと話が長くなりそうなので、今回はここまでにします。
ここまでお読みいただき、ありがとうございました。