ClassモジュールのInitializeの使い方
ClassモジュールでInitializeを利用すると、Classモジュールを呼び出した時に自動的に処理が走るプロシージャを作れます。
実演
'このClassモジュール名は「Class」です。
Private Sub Class_Initialize()
Msgbox "Hello World"
End Sub
これを呼び出すとこんなかんじですね。
Sub CallTest()
Dim Class As Class
set Class = New Class
End Sub
classモジュールを呼び出すと処理が走るので、こういう感じになります。
応用編
前回紹介したClassモジュールの使い方を、Initialize機能でキレイにします。
'Classモジュール
'FSOのプロパティ
Property Get FSO() As Object
Set FSO = CreateObject("Scripting.FileSystemObject")
End Property
'WSHのプロパティ
Property Get WSH() As Object
Set WSH = CreateObject("Wscript.Shell")
End Property
'ここから標準モジュール
'マクロブックに存在するファイルを全部コピー
Sub CopyFile()
Dim obj As New CallObject
For each File In obj.FSO.GetFolder(ThisWorkbook.Path).Files
obj.WSH.Run "cmd.exe /c XCOPY " & File.Path & " " & "backup_" & File.Path
Next
End Sub
プロパティには通常オブジェクトの性質を示すデータを格納するわけだから、上記の使い方はそもそも邪道というか間違いですね。
こういう使い方がよいです。
'Classモジュール
横断定義
Private FSO As Object
Private WSH As Object
Private Sub Class_Initialize()
Set FSO = CreateObject("Scripting.FileSystemObject")
Set WSH = CreateObject("Wscript.Shell")
End Sub
'ここから標準モジュール
'マクロブックの存在するフォルダ内のすべてのファイルをコピー
Sub CopyFile()
Dim obj As New CallObject
'Classオブジェクトは上記のように一行で定義することができます。
'ただし以下のように明示的に呼び出している場合のみ。
For each File In obj.FSO.GetFolder(ThisWorkbook.Path).Files
obj.WSH.Run "cmd.exe /c XCOPY " & File.Path & " " & "backup_" & File.Path
Next
End Sub
このような使い方をすると、各オブジェクトを都度呼び出すという必要がないのです。
Dim obj As New CallObject
の部分でFSOやWSHにオブジェクトを格納しているので
メモリを余分に食うようなことがないです。
念のためInitializeを閉じる用にTerminateも用意しとくといいかもしれないですね。
なお、FSO やWSHはグローバル変数として使うと、定義内容を書き換えられてしまうので、プライベート関数として使いましょう。
プライベート関数を使った場合でも、書き換え用アクセサ(Property Let)を使えば書き換えられますが
これらは定数として使うべきなので、間違ってもこれらオブジェクトの書き換え用アクセサは用意しないようにしましょう。
以上。