前項まででDecoratorにもとづくフレームワークはだいたい仕上がりました。最後に、マクロを起動するときと閉じる際の終了処理について考えてみます。
マクロの起動は、マクロを含むブックを開いたときから始めます。ですから、ThisWorkbookのopenイベントでAppDecoratorのInitializeメソッドを呼び出せばよいのです。ここでは、AppDecoratorのインスタンスをThisWorkbookで宣言して呼び出せば、コードは以下のようになります:
Dim appDeco As New AppDecorator
Private Sub Workbook_Open()
appDeco.Initialize
End Sub
|
マクロを閉じる際には、Class_Terminateイベントが呼ばれるはずなのですが、なぜかうまくいきませんでした。そこで明示的に呼び出すterminateメソッドを実装しようと思います。実装の際には、上位のDecoratorから、下位のDecoratorや自身のDelegateへとカスケード式に呼び出せるようにしてみます。
まず、SheetDecoratorとSheetDelegateです。単にSheetDecoratorからSheetDelegateを呼び出すだけです。
[SheetDecorator]
Public Sub terminate()
If Not sheetDele Is Nothing Then
sheetDele.terminate
End If
End Sub
[SheetDelegate]
Public Sub terminate()
'ここに終了時のコードを追加する
End Sub
|
次に、BookDecoratorとBookDelegateのterminateメソッドです。SheetDecoratorのterminateメソッドを呼び出している分だけ複雑になっています。
[BookDecorator]
Public Sub terminate()
If Not bookDele Is Nothing Then
bookDele.terminate
End If
If sheetDecorators.Count > 0 Then
Dim sd As SheetDecorator
For Each sd In sheetDecorators
sd.terminate
Next
End If
End Sub
[BookDelegate]
Public Sub terminate()
'ここに終了時のコードを追加する
End Sub
|
最後にAppDecoratorです。terminateメソッド自身は簡単です。自身のterminateメソッドもここに追加します
Public Sub terminate()
'ここに終了時のコードを追加する
If bookDecorators.Count > 0 Then
Dim bd As BookDecorator
For Each bd In bookDecorators
bd.terminate
Next
End If
End Sub
|
そして、自身を閉じる時にterminateメソッドが自動的に呼び出されるように、ThisWorkbookのBeforeCloseイベントを追加します。
[ThisWorkbook]
Private Sub Workbook_BeforeClose(Cancel As Boolean)
appDeco.terminate
End Sub
|
これで、終了時の処理が全て追加されました。