LoginSignup
0
2

More than 3 years have passed since last update.

【VBA】Classモジュールの書き方_Initialize版

Last updated at Posted at 2019-06-21

ClassモジュールのInitializeの使い方

 ClassモジュールでInitializeを利用すると、Classモジュールを呼び出した時に自動的に処理が走るプロシージャを作れます。

実演

Class_Initialize
'このClassモジュール名は「Class」です。
Private Sub Class_Initialize()
 Msgbox "Hello World"
End Sub

これを呼び出すとこんなかんじですね。

CallTest
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)を使えば書き換えられますが
これらは定数として使うべきなので、間違ってもこれらオブジェクトの書き換え用アクセサは用意しないようにしましょう。

以上。

0
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2