Applicationオブジェクトのイベントを利用する

複数のブックで同じ内容のイベントを利用したい場合、それぞれのブックにその内容を記述していてはすっきりしません。この場合、Workbook オブジェクトの上位にある Application オブジェクトが利用できますが、このモジュールは標準では用意されていません。クラスモジュールを自分で作成する必要があります。

このサンプルでは、ブックの保存時にブックのサイズとその増減を表示できるようにします。' Class1 ' というオブジェクト名でクラスモジュールを挿入し(新規の挿入であれば標準でこの名前です)、以下を記述します。

Public WithEvents App As Application

Private Sub App_WorkbookBeforeSave(ByVal Wb As Workbook, _
                                         ByVal SaveAsUI As Boolean, Cancel As Boolean)
  WbFullName = Wb.FullName
  If InStr(1, WbFullName, ".xls", 1) = 0 Then Exit Sub   ' 新規のブックであれば終了
  BeforeFileLen = FileLen(Wb.FullName)
  Application.OnTime Now + TimeValue("00:00:01"), "ShowFileLen"
End Sub

以下を標準モジュール内に記述します。

Public X As New Class1
Public WbFullName As String
Public BeforeFileLen As Single

Sub InitializeApp()
  Set X.App = Application
End Sub

Sub ShowFileLen()
  Dim AfterFileLen As Single
  Dim Difference As Single
  Dim PlusMinus As String
  AfterFileLen = FileLen(WbFullName)
  Difference = AfterFileLen - BeforeFileLen
  If Difference > 0 Then
    PlusMinus = "+"
  ElseIf Difference = 0 Then
    PlusMinus = "±"
  End If
  MsgBox WbFullName & " : " & ConvertBite(AfterFileLen) & _
                     "(" & PlusMinus & ConvertBite(Difference) & ")", vbInformation
End Sub

Function ConvertBite(FLen As Single) As String
  If FLen < 1048576 Then
    ConvertBite = Format(FLen / 1024, "#,##0.0") & "KB"
  Else
    ConvertBite = Format(FLen / 1048576, "#,##0.00") & "MB"
  End If
End Function

InitializeApp を Workbook_Open イベント内に記述し、ファイルの種類を ' Microsoft Excel アドイン (*.xla)' で XLStart フォルダに保存すれば完成です。

ちなみに同じイベントの場合、Workbookのイベントが終了してから、Applicationのイベントが実行されます。