4.6 プログラムのまとめ

これまでで一番しんどい章でした。最後に、この章のプログラムをまとめておきましょう。

1. 目的

マクロとデータを分離するため、マクロを複数のブックから参照するためのフレームワークを、3章で使用したDecoratorを応用して作成する。

2. [Class] SheetDecorator, SheetDelegate


[SheetDecorator]
Public WithEvents wsheet As Worksheet
Public parent As BookDecorator
Private sheetDele As Object

Public Sub Initialize(ws As Worksheet, d As Object, bd As BookDecorator)
    Set wsheet = ws
    Set parent = bd
    Set sheetDele = d
    If Not sheetDele Is Nothing Then
        sheetDele.Initialize Me
    End If
End Sub

Public Sub terminate()
    If Not sheetDele Is Nothing Then
        sheetDele.terminate
    End If
End Sub

[SheetDelegate]
Public WithEvents wsheet As Worksheet
Public parent As SheetDecorator

Public Sub Initialize(sd As SheetDecorator)
    Set wsheet = sd.wsheet
    Set parent = sd
End Sub

Public Sub terminate()
    'ここに終了時の処理を書く
End Sub

3. [Class] BookDecorator, BookDelegate


[BookDecorator]
Public WithEvents wbook As Workbook
Public parent As AppDecorator
Private bookDele As Object
Private sheetDecorators As New Collection 'of SheetDecorator

Public Sub Initialize(wb As Workbook, d As Object, ad As AppDecorator)
    Set wbook = wb
    Set parent = ad
    Set bookDele = d
    If Not bookDele Is Nothing Then
        bookDele.Initialize Me
        bookDele.SetSheetDecorators
    End If
    Dim sd As SheetDecorator
End Sub

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

Public Sub AddSheetDecorator(sd As SheetDecorator)
    sheetDecorators.Add Item:=sd
End Sub

[BookDelegate]
Public WithEvents wbook As Workbook
Public parent As BookDecorator

Public Sub Initialize(bd As BookDecorator)
    Set wbook = bd.wbook
    Set parent = bd
End Sub

Public Sub terminate()
    'ここに終了時の処理を書く
End Sub

Public Sub SetSheetDecorators()
    'SheetDecoratorのFactory Method
End Sub

4. [Class] AppDecorator, BookChecker


[AppDecorator]
Public WithEvents app As Application
Private bookDecorators As New Collection 'of BookDecorator
Private bookCheckers As New Collection 'of BookChecker

Public Sub Initialize()
    Set app = Application
    Dim wb As Workbook
    SetBookCheckers
    If bookCheckers.Count > 0 Then
        For Each wb In Workbooks
            CreateBookDecorator wb
        Next
    Else
        Unload Me
    End If
End Sub

Public Sub terminate()
    'ここに終了時の処理を書く
    If bookDecorators.Count > 0 Then
        Dim bd As BookDecorator
        For Each bd In bookDecorators
            bd.terminate
        Next
    End If
End Sub

Private Sub SetBookCheckers()
    'BookCheckerの登録
End Sub

Private Sub CreateBookDecorator(wb As Workbook)
    Dim bc As Object 'BookChecker
    For Each bc In bookCheckers
        If bc.CheckBook(wb) = True Then
            Dim bd As New BookDecorator
            bd.Initialize wb, bc.CreateBookDelegate, Me
            bookDecorators.Add Item:=bd
        End If
    Next
End Sub

Private Sub app_NewWorkbook(ByVal wb As Workbook)
    CreateBookDecorator wb
End Sub

Private Sub app_WorkbookBeforeClose(ByVal wb As Workbook, Cancel As Boolean)
    Dim bd As BookDecorator
    Dim i As Integer
    i = 1
    For Each bd In bookDecorators
        If bd.wbook Is wb Then
            bd.terminate
            bookDecorators.Remove i
        End If
        i = i + 1
    Next
End Sub

Private Sub app_WorkbookOpen(ByVal wb As Workbook)
    CreateBookDecorator wb
End Sub

[BookChecker]
Public Function CheckBook(wb As Workbook) As Boolean
    '指定するBookDecoratorを作成するかの判定
End Function

Public Function CreateBookDelegate() As Object
    '指定するBookDelegateを返す
End Function


5. [Module]ThisWorkbook


[ThisWorkbook]
Dim appDeco As New AppDecorator

Private Sub Workbook_Open()
    appDeco.Initialize
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    appDeco.terminate
End Sub