- この記事では
- コンストラクタについて
- コンストラクタ
- 実験:コンストラクタが呼ばれるタイミングを知る
- デストラクタについて
- 実験:デストラクタが呼ばれるタイミングを知る
- デストラクタはどんな場面で使うのか
- 次回はGodExcelオブジェクトに戻ります
この記事では
- VBAのクラスモジュールの使い方を解説しています。
- クラスモジュールのコンストラクタ及びデストラクタについて解説しています。
- この記事はクラスモジュールの実践的な使い方を学びたい人に向けて書いています。
- シリーズものです。その1はこちら→挫折した人のためのVBAクラスモジュール入門_その1 - 適材適所。
コンストラクタについて
前回は、GodExcelオブジェクトにコンストラクタを追加して、シートの情報を設定する処理をオブジェクト内部にカプセル化したのでした。
コンストラクタについての説明が少し不十分だったので、今回はコンストラクタについて少し言及したいと思います。
コンストラクタ
Class_Initalizeサブプロシージャは特別なサブプロシージャで、オブジェクトが生成されるときに必ず呼ばれます。
と前回述べました。
百聞は一見に如かず。やってみましょう。
実験:コンストラクタが呼ばれるタイミングを知る
コンストラクタがどんな感じで呼ばれるか確認してみましょう。
'SampleClass.cls Private Sub Class_Initialize() Debug.Print "生成されました" End Sub
'sample.bas Sub sample() Dim Class As SampleClass Set Class = New SampleClass End Sub
sampleプロシージャを実行すると、イミディエイトウィンドウに生成されました
と出力されます。
Set Class = New SampleClass
ここでオブジェクトが生成されていることがわかります。
このシリーズで題材にしている、シートの情報をオブジェクト化する場合は、このコンストラクタの中でシートの情報を読み取ってプロパティに設定してあげるとスマートです。
VBAのコンストラクタは、基本的に引数のあるコンストラクタは扱えません。そこがちょっと不便だったりしますが、まぁしょうがない。
コンストラクタの話と一緒に出てくるのが、デストラクタです。
デストラクタについても簡単に見ておきましょう。
デストラクタについて
デストラクタは、コンストラクタの逆で、オブジェクトが破棄されたときに呼び出されます。 コンストラクタと同じ要領で設定します。
実験:デストラクタが呼ばれるタイミングを知る
こんなコードで試してみます。
'SampleClass.cls Private Sub Class_Initialize() Debug.Print "生成されました" End Sub Private Sub Class_Terminate() Debug.Print "破棄されました" End Sub
`sample.bas Sub sampleTest() Dim sample As SampleClass Set sample = New SampleClass 'オブジェクトを破棄 Set sample = Nothing End Sub
sampleTestプロパティを実行すると、Set sample = Nothing
のところで、「破棄されました」のメッセージがイミディエイトウィンドウに出力されたかと思います。
このSet sample = Nothing
は、オブジェクトを破棄する命令です。
Nothingの部分をコメントアウトして実行すると、sampleTestプロシージャが終わるとデストラクタが呼ばれます。
基本的にオブジェクトの存在期間は変数のスコープと同じようだと考えてもらって差支えありません。
宣言されたプロシージャが終われば、ほぼ破棄されます。
破棄されるというのは、オブジェクトへの参照が消えることです。
オブジェクトへの参照が消えるというのはオブジェジェクトへのデータへアクセスすることができないということです。
デストラクタはどんな場面で使うのか
もしかしたら中々出番がないかもしれません。
私の経験だと、デストラクタで定義するのは念のための処理が多い気がします。
このブログでも紹介している、データベースと接続するオブジェクトではオブジェクトが破棄される前に、データベースとの接続を閉じています。
次回はGodExcelオブジェクトに戻ります
ということで一旦、GodExcelオブジェクトから離れてコンストラクタとデストラクタについて簡単に見てみました。
次回はGodExcelオブジェクトに戻って、これを完成させていきます。
ここまでお読みいただき、ありがとうございました。