この記事では
- VBAのクラスモジュールの使い方を解説しています。
- クラスモジュールの実例を用いて解説しています。
- この記事はクラスモジュールの実践的な使い方を学びたい人に向けて書いています。
- シリーズものです。その1はこちら→挫折した人のためのVBAクラスモジュール入門_その1 - 適材適所。
オブジェクトを生成できた
前回はクラスモジュールを使ってオブジェクトを生成することができたのでした。
でもダメGodだったのでした。
今回は、このダメGodのプロパティに触れるようにして、Lv8くらいにしていきたいと思います。
Privateなプロパティ
前回のGodExcelクラスはこんな感じでした。
'プロパティ Dim pNameFurigana As String
せっかく書いたのですが、このプロパティ、実はPrivateなのです。
Private pNameFurigana As String
と同義です。
「Privateって何だよ!!訳知り顔で語ってんじゃねーよっ!!」 と聞こえてきました。
はい、すいません。
Privateとは
Privateとというのは
外部からこのプロパティを直接取得したり、設定したりすることはできません!!
という意味です。
よくわからなくなってきました。
外部ってなんでしょう?
外部とは自分以外ということです。
わけわかりませんね。
そういう時は、オブジェクトの気持ちになって考えてみてください。
オブジェクトについて考えるときは、視点を変えることが大事です。
GodExcelオブジェクトからすると、自分以外=外部です。
GodExcelからすると、プロパティは自分の中の情報です。
例えれば プロパティはGodExcelオブジェクトの個人情報みたいなものですかね。
その個人情報は外部から勝手に覗かれては困ります。
個人情報を他人、つまり外部から自分の伺い知らないところで覗き見られてはたまらない、ということで、プロパティは基本的にPrivateにします。
Private に設定されたプロパティは外からいじることができません。
じゃあ、何もできないじゃん!!
そうなんです、このままじゃダメなんです。ダメGodのままです。
こういう時は、プロパティの触り方をクラスモジュールに定義することで、プロパティを触ることができるようにしてあげます。
プロパティを設定できるようにする
クラスモジュールはオブジェクトの設計図です。そこには、どのようなプロパティを持つかだけでなく、どのようにプロパティにアクセスするかも定義することができます。
これが「触り方を定義する」ということなんですね。
プロパティを設定できるようにするためには、Propety Setステートメントを使います。
こんな感じ。
Public Property Let NameFurigana(aNameFurigana As String) pNameFurigana = aNameFurigana End Property
うん、意味不明。 私が最初クラスモジュールについて学び始めたとき、このコードの意味が全くわかりませんでした。
このコードの理解が一つの関門かもしれません。
Property Letとは、一種の関数みたいなものです。NameFurigana関数。そのように考えると理解が早まります。
コードを細かく見てみると
Public:この操作は誰でもできます。
Property:プロパティに関する定義ですよ。
Let:設定します。ただし、プリミティブ型のプロパティです。
NameFurigana:呼び出すときは、NameFuriganaという名前で呼び出してね。
(NameFurigana As String):()で囲まれてるのは、これをプロパティに設定しますという意味。
pNameFurigana = aNameFurigana:pNameFuriganaにaNameFuriganaを代入してね。
もう少し細かく見ると 1.Publicがあることで、この操作は誰でもできますよ、という意味になります。
2.は決まり文句です。
3.Let、これは、プロパティを設定するときに必須なのですが、文字列や整数といった単純な(ここでは理解のためにこう言わせてもらいます)データ型のときにはこのLetを使います。
4.外部から呼び出すときは、NameFuriganaで呼び出します。つまり、外部からは、NameFuriganaがプロパティに見えます。外部からpNameFuriganaは見えません。このオブジェクトのコード以外からこのオブジェクトを触ろうとしたとき、呼び出すプロパティは、NameFuriganaに「見える」ということです。
ぶっちゃけこの呼び出し語は何でも大丈夫です。でもオブジェクトの内部的にpNameFuriganaとしたので、pをとってNameFuriganaとしました。ちなみにpはpropertyのpです。内部のプロパティの場合を識別するため、そのようにしてみました。
5.aNameFuriganaは、設定に使われます。この変数がpNameFuriganaに代入されることになります。 ここの変数名もなんでも大丈夫です。基本的にはわかりやすい変数名にした方がよいです。接頭辞をaとしたのは、argument(引数)のaです。
6.pNameFurigana = aNameFurigana これがミソです。内部的なプロパティであるpNameFuriganaに、引数で与えられたaNameFuriganaを代入してます。外部から直接触ることはできないpNameFuriganaですが、オブジェクト内部からはいくらでも触ることができます。この特性を利用して、外部からはPropertyを通してオブジェクトのプロパティに触るという作りにします。
プロパティに値を設定してみる
ではクラスからオブジェクトを生成して、オブジェクトにプロパティを設定してみましょう。
現在のGodExcelクラスはこんな感じになっています。
'プロパティ Dim pNameFurigana As String Public Property Let NameFurigana(aNameFurigana As String) pNameFurigana = aNameFurigana End Property
標準モジュールにはこのように書いてみます。
Sub sample() Dim god As GodExcel Set god = New GodExcel god.NameFurigana = "かみえくせる" End Sub
godオブジェクトのふりがなに「かみえくせる」と設定してみました。
でもこれでは実際に設定されているか確認できません。
そういうときは、ウォッチウィンドウを使って確認してみましょう。 ウォッチ式にgod変数を指定し、god.NameFuriganaにブレークポイントを設定します。
今のところ、pNameFuriganaに値は設定されていません。 F8のステップインで進めていくと・・・
あ、先ほどのプロパティ設定のところに処理が飛びました。
お、値が設定されました!! このあと処理は、End Subまで進んで終わります。
無事にGodExcelオブジェクトに値を設定することができました。
サブプロシージャからは、NameFuriganaというプロパティしかないように見えますが、ウォッチウィンドウを見ると、pNameFuriganaというプロパティがあることがわかりますね。
プロパティへの値の設定方法については、ここまでとなります。
次回はプロパティの値を取得について定義していきたいと思います。
ここまでお読みいただき、ありがとうございました。