4.5 起動と終了時の処理

前項までで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

これで、終了時の処理が全て追加されました。