これまでで一番しんどい章でした。最後に、この章のプログラムをまとめておきましょう。
マクロとデータを分離するため、マクロを複数のブックから参照するためのフレームワークを、3章で使用したDecoratorを応用して作成する。
[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
|
[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
|
[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
|
[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
|