適材適所

パソコン作業の自動化・効率化のための情報を発信するブログ(VBA,PowerShellなど)

挫折した人のためのVBAクラスモジュール入門_その8

この記事では

  • 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のコンストラクタは、基本的に引数のあるコンストラクタは扱えません。そこがちょっと不便だったりしますが、まぁしょうがない。

コンストラクタの話と一緒に出てくるのが、デストラクタです。

デストラクタについても簡単に見ておきましょう。

デストラクタについて

デストラクタは、コンストラクタの逆で、オブジェクトが破棄されたときに呼び出されます。 コンストラクタと同じ要領で設定します。

f:id:shinmai_papa:20190807095501p:plain

実験:デストラクタが呼ばれるタイミングを知る

こんなコードで試してみます。

'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プロシージャが終わるとデストラクタが呼ばれます。

基本的にオブジェクトの存在期間は変数のスコープと同じようだと考えてもらって差支えありません。

宣言されたプロシージャが終われば、ほぼ破棄されます。

破棄されるというのは、オブジェクトへの参照が消えることです。

オブジェクトへの参照が消えるというのはオブジェジェクトへのデータへアクセスすることができないということです。

デストラクタはどんな場面で使うのか

もしかしたら中々出番がないかもしれません。

私の経験だと、デストラクタで定義するのは念のための処理が多い気がします。

このブログでも紹介している、データベースと接続するオブジェクトではオブジェクトが破棄される前に、データベースとの接続を閉じています。

www.tekizai.net

次回はGodExcelオブジェクトに戻ります

ということで一旦、GodExcelオブジェクトから離れてコンストラクタとデストラクタについて簡単に見てみました。

次回はGodExcelオブジェクトに戻って、これを完成させていきます。

ここまでお読みいただき、ありがとうございました。

www.tekizai.net