VBA技術解説
クラスを使った全ブック(他ブック)のイベント補足

ExcelマクロVBAの問題点と解決策、VBAの技術的解説
公開日:2019-02-06 最終更新日:2022-06-29

クラスを使った全ブック(他ブック)のイベント補足


VBAでイベントを使う場合は、通常はイベントが発生するオブジェクト(ブックやシート等)のモジュールに記載します、
つまり、各ブックの中にマクロを入れなければなりません。


開いている全ブックまたは、他の特定のブックのイベントを処理するには、
WithEventsキーワードを付けた変数宣言を使います、
クラスを使って全ブックまたは他ブックのイベントを補足する方法について具体的なVBAコードで紹介します。

他ブック(全ブック)のイベントを補足するだけなら、クラスを使わなくても、
ThisWorkbookにWithEventsキーワードを付けた変数宣言をする方法で可能です。
ですが、こまような処理の場合にはクラスを使ったほうが保守や拡張がしやすくなると思います。

クラスの基本と、イベントについては以下を参照してください。
VBAのクラスとは(Class,Property)
・オブジェクトとは ・オブジェクト指向とは ・カプセル化 ・オブジェクト指向とカプセル化とクラス ・クラスの必要性と利点 ・一般的なクラスに関する説明 ・クラスの比喩的説明 ・クラスの使い方 ・クラスを体験してみる ・クラスの使用例 ・クラス入門の最後に
Workbookのイベントプロシージャー
・Workbookのイベント一覧 ・イベントプロシージャー追加のVBE操作 ・Workbook_Open:Workbookのイベント ・Workbook_BeforeClose:Workbookのイベント ・Workbook_SheetChange:Workbookのイベント
Worksheetのイベントプロシージャー
・Worksheetのイベント ・イベントプロシージャー追加のVBE操作 ・Activate:Worksheetのイベント ・BeforeDoubleClick:Worksheetのイベント ・BeforeRightClick:Worksheetのイベント ・Change:Worksheetのイベント ・SelectionChange:Worksheetのイベント ・全てのシートまたは複数のシートに対するイベント
VBAスタンダード:イベント
・【ここでのポイント】 ・イベントとは ・ブックのイベント ・シートのイベント ・イベントプロシージャの規則を理解する ・【業務改善の実務】 ・【本サイト内の関連ページ】 ・VBAエキスパート公式テキスト

今回の場合は、開いている全ブックのイベントを補足したいので、
Applicationのイベントの中にあるブックやシートのイベントを使用します。
これについての詳細は後述します。



>WithEventsキーワード

>
WithEventsキーワードは、次の構文で使用します。
Dim ステートメント
Private ステートメント
Public ステートメント

変数がイベントに対応するためのオブジェクト変数であることを指定するキーワードです。
オブジェクトのモジュールのみで使えます、つまり、標準モジュールでは使用できません。
WithEventsは任意の数の変数に宣言できます。
ただし、WithEventsでは配列は作成できません。
また、キーワードNewとWithEventsは一緒には使用できません。

Private WithEvents xlApp As New Excel.Application

Private WithEvents xlApp As Excel.Application
・・・
Set xlApp = New Excel.Application
このように、WithEventsとNewは分けて使わなければなりません。


>全体の機能と構成

>
他ブックのイベントを補足するプロシージャーを起動することで、
指定のExcelアプリケーション(既定は同一Excelアプリケーション)内での、
全てのブック・シートのイベントを補足し、
何らかの処理(ここではメッセージボックスを表示して補足できている事のみ確認)を行えるようにしています。

イベントを補足するブック・シートを指定して対象を絞れるようにしています。
何も指定しない場合は、全てのブック・シートが対象になります。

クラスを作成するブックの全体構成

ブック
任意の名称のマクロ有効ブック(.xlsm)
シート
先頭シートを対象ブック・シートの指定に使用

マクロ VBA サンプル画像

これはクラスの動作確認用に使うものです。
クラスを起動する標準モジュールのプロシージャーで使用しています。

A列:ブック名を指定
B列~:シート名を指定、横に何個でも指定可能

ブック名のみ指定した場合は、指定したブックのイベントに対して有効
シート名が指定されている場合は、指定ブックの指定シートのイベントに対して有効
上図であれば、以下が対象となります。

・Book2のブックイベント
・Book*のSheet2,Sheet3のシートのイベント
・全てのブックのSheet5*のシートのイベント

ブック名・シート名ともに、Like演算子で有効なワイルドカードが使用できます。
クラスモジュール
オブジェクト名:clsEvent

オブジェクト名を変更する場合は、標準モジュールの変数宣言も変更してください。
標準モジュール
クラス動作確認用のメインプロシージャー
Public Sub StartEventClass()

クラスに指定したブック・シートを配列で受けとる
Sub checkBookSheets()

プロシージャー名は任意に変更して構いません。
この標準モジュールは、あくまでクラスの動作確認用で作成したものです。


>VBAコード

>
クラス:clsEvent の全VBAコード

Option Explicit

'対象のExcelアプリケーション
Private WithEvents xlApp As Excel.Application

'対象ブック・シート:1次元配列の要素に構造体を入れる
Private Type typeBookSheets
  Book As String 'ブック
  Sheets() As String 'シート1,シート2,…
End Type
Private pBookSheets() As typeBookSheets
Private pCntBS As Integer

'イベント停止(一時的に停止させる)
Private pStopEvent As Boolean

'==================================================
' 公開プロパティ
'==================================================
'Excelアプリケーションの設定・取得
Public Property Set ExcelApplication(argApp As Excel.Application)
  Set xlApp = argApp
End Property
Public Property Get ExcelApplication() As Excel.Application
  Set ExcelApplication = xlApp
End Property

'イベント停止(一時的に停止させる)の取得設定
Public Property Let StopEvent(argStop As Boolean)
  pStopEvent = argStop
End Property
Public Property Get StopEvent() As Boolean
  StopEvent = pStopEvent
End Property

'==================================================
' 公開メソッド
'==================================================
'対象ブック・シートの初期化
Public Sub InitializeBookSheets()
  pCntBS = 0
  Erase pBookSheets
End Sub

'対象ブック・シートの設定
Public Function AddBookSheet(ByRef argAry) As Boolean
  Dim i1 As Long
  Dim i2 As Long
  Dim ix As Integer
  Dim myArray() As String
  
  '配列の次元数により分岐
  Select Case GetDimension(argAry)
    
    Case 1 '1次元配列
      ReDim Preserve pBookSheets(pCntBS)
      pBookSheets(pCntBS).Book = argAry(LBound(argAry))
      ix = 0
      ReDim myArray(ix)
      For i1 = LBound(argAry) + 1 To UBound(argAry)
        If argAry(i1) <> "" Then
          ReDim Preserve myArray(ix)
          myArray(ix) = argAry(i1)
          ix = ix + 1
        End If
      Next
      pBookSheets(pCntBS).Sheets = myArray
      Erase myArray
      pCntBS = pCntBS + 1
      
    Case 2 '2次元配列
      For i1 = LBound(argAry, 1) To UBound(argAry, 1)
        ReDim Preserve pBookSheets(pCntBS)
        pBookSheets(pCntBS).Book = argAry(i1, LBound(argAry, 2))
        ix = 0
        ReDim myArray(ix)
        For i2 = LBound(argAry, 2) + 1 To UBound(argAry, 2)
          If argAry(i1, i2) <> "" Then
            ReDim Preserve myArray(ix)
            myArray(ix) = argAry(i1, i2)
            ix = ix + 1
          End If
        Next
        pBookSheets(pCntBS).Sheets = myArray
        Erase myArray
        pCntBS = pCntBS + 1
      Next
      
    Case Else '1,2次元以外はエラーで戻す
      AddBookSheet = False
      Exit Function
  End Select
  
  AddBookSheet = True
End Function

'対象ブック・シートの全取得:2次元配列で戻す
Public Function GetBookSheets() As Variant
  Dim i1 As Integer, i2 As Integer
  Dim intMax As Integer
  Dim myArray() As String
  
  '配列内の最大シート数を取得
  intMax = 0
  For i1 = 0 To UBound(pBookSheets)
    If UBound(pBookSheets(i1).Sheets) > intMax Then
      intMax = UBound(pBookSheets(i1).Sheets)
    End If
  Next
  
  '構造体の1次元配列を、構造体をバラして2次元配列に
  ReDim myArray(UBound(pBookSheets), intMax + 1)
  For i1 = 0 To UBound(pBookSheets)
    myArray(i1, 0) = pBookSheets(i1).Book
    For i2 = LBound(pBookSheets(i1).Sheets) To UBound(pBookSheets(i1).Sheets)
      myArray(i1, i2 + 1) = pBookSheets(i1).Sheets(i2)
    Next
  Next
  GetBookSheets = myArray
End Function

'==================================================
' クラスのメソッド
'==================================================

'クラスの初期化
Private Sub Class_Initialize()
  Set Me.ExcelApplication = Application
  Me.StopEvent = False
  Me.InitializeBookSheets
End Sub

'クラスの終了処理
Private Sub Class_Terminate()
  Set xlApp = Nothing
End Sub

'==================================================
' Applicationのブックイベント
'==================================================

'ブックが開かれたときに発生
Private Sub xlApp_WorkbookOpen(ByVal wb As Workbook)
  If Me.StopEvent Then Exit Sub
  If Not CheckBook(wb) Then Exit Sub
  
  'メッセージボックスでイベント補足を確認
  MsgBox "WorkbookOpen : " & wb.FullName
End Sub

'ブックが閉じられる直前に発生
Private Sub xlApp_WorkbookBeforeClose(ByVal wb As Workbook, Cancel As Boolean)
  If Me.StopEvent Then Exit Sub
  If Not CheckBook(wb) Then Exit Sub
  
  'メッセージボックスでイベント補足を確認
  MsgBox "WorkbookBeforeClose : " & wb.FullName
End Sub

'新しいブックが作成されたときに発生
Private Sub xlApp_NewWorkbook(ByVal wb As Workbook)
  If Me.StopEvent Then Exit Sub
  If Not CheckBook(wb) Then Exit Sub
  
  'メッセージボックスでイベント補足を確認
  MsgBox "NewWorkbook : " & wb.Name
End Sub

'==================================================
' Applicationのシートイベント
'==================================================

'シートがアクティブになったときに発生
Private Sub xlApp_SheetActivate(ByVal Sh As Object)
  If Me.StopEvent Then Exit Sub
  If Not CheckSheet(Sh) Then Exit Sub
  
  'メッセージボックスでイベント補足を確認
  MsgBox "SheetActivate : [" & Sh.Parent.Name & "]" & Sh.Name
End Sub

'ワークシートのセルが変更されたときに発生
Private Sub xlApp_SheetChange(ByVal Sh As Object, ByVal Target As Range)
  If Me.StopEvent Then Exit Sub
  If Not CheckSheet(Sh) Then Exit Sub
  
  'メッセージボックスでイベント補足を確認
  MsgBox "SheetChange : " & Target.Address(external:=True)
End Sub

'セルがダブルクリックされたときに発生
Private Sub xlApp_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
  If Me.StopEvent Then Exit Sub
  If Not CheckSheet(Sh) Then Exit Sub
  
  'メッセージボックスでイベント補足を確認
  MsgBox "SheetBeforeDoubleClick : " & Target.Address(external:=True)
End Sub

'==================================================
' 非公開メソッド
'==================================================

'対象ブックの判定
Private Function CheckBook(ByVal wb As Workbook) As Boolean
  '指定なしはすべて対象とする
  If pCntBS = 0 Then
    CheckBook = True
    Exit Function
  End If
  
  'ブック・シート指定の配列にブック名があるか判定
  Dim i1 As Integer
  CheckBook = False
  For i1 = 0 To UBound(pBookSheets)
    'ブックの名称判定
    If wb.Name Like pBookSheets(i1).Book Then
      'シート指定がない時のみブックの指定と判定
      If pBookSheets(i1).Sheets(0) = "" Then
        CheckBook = True
        Exit Function
      End If
    End If
  Next
End Function

'対象シートの判定
Private Function CheckSheet(ByVal ws As Worksheet) As Boolean
  '指定なしはすべて対象とする
  If pCntBS = 0 Then
    CheckSheet = True
    Exit Function
  End If
  
  'ブック・シート指定の配列にシート名があるか判定
  Dim i1 As Integer, i2 As Integer
  Dim wb As Workbook
  CheckSheet = False
  Set wb = ws.Parent
  For i1 = 0 To UBound(pBookSheets)
    'ブックの名称判定
    If wb.Name Like pBookSheets(i1).Book Then
      'シートの名称判定
      For i2 = LBound(pBookSheets(i1).Sheets) To UBound(pBookSheets(i1).Sheets)
        If ws.Name Like pBookSheets(i1).Sheets(i2) Then
          CheckSheet = True
          Exit Function
        End If
      Next
    End If
  Next
End Function

'配列の次元数取得とエラー値判定:1,2以外の戻り値はエラー
Private Function GetDimension(ByVal argAry) As Integer
  On Error Resume Next
  
  '配列の次元数取得
  Dim intDim As Integer
  Dim tmpDim As Integer
  intDim = 0
  Do While Err.Number = 0
    intDim = intDim + 1
    'エラーになった時点で配列が終わり
    tmpDim = UBound(argAry, intDim)
  Loop
  Err.Clear
  intDim = intDim - 1
  
  '配列の場合、エラー値データの判定
  Dim vTemp
  Select Case intDim
    Case 1, 2
      For Each vTemp In argAry
        If IsError(vTemp) Then
          GetDimension = 0
          Exit Function
        End If
      Next
  End Select
  
  GetDimension = intDim
  On Error GoTo 0
End Function

以下のVBAコードの解説で簡単に説明しています。
個々のステートメントについての詳細までは解説していません。
VBA内のコメントを頼りに読み解いてください。

クラスに興味を持つということは、VBAはある程度理解していると思いますので、
今回のクラス特有の機能部分にはあまりこだわらず、
クラスの全体構成と、他ブックのイベント補足方法について確認しつつ、
実際に動かして、ブレークポイントで止めたりしながら動作確認してみてください。

クラスでのプロパティ・メソッドの実装方法や、WithEventsの使い方を中心にVBAコードを読んでください。


>VBAコードの解説

>

変数

対象のExcelアプリケーション
Private WithEvents xlApp As Excel.Application

イベントに対応するためのオブジェクト変数の定義です。

対象ブック・シート、1次元配列の要素に構造体を入れる
Private Type typeBookSheets
  Book As String 'ブック
  Sheets() As String 'シート1,シート2,…
End Type
Private pBookSheets() As typeBookSheets
Private pCntBS As Integer

構造体typeBookSheetsを定義
構造体のメンバーはBookとSheets()になります。
Bookはプック名をいれ、
Sheets()は、シート名を強い列で入れます。
そして、構造体typeBookSheetsを型に持つ配列を定義しています。
pCntBSは、配列の現在要素数のカウントに使用します。
イベント停止(一時的に停止させる)
Private pStopEvent As Boolean

マクロ動作でブックやシートの変更を行ってもイベントが発生します。
そのような場合に、この変数をFalseにすることでその間のイベント発生を停止できるようにしています。

このプロパティを使わずに、
Application.EnableEvents = False
こちらを使っても良いでしょう、この場合はこのクラスだけではなく全てのイベントが抑止されます。

公開プロパティ

Excelアプリケーションの設定・取得
Public Property Set ExcelApplication(argApp As Excel.Application)

このクラスの対象となるExcel.Applicationを設定するプロパティです。
Class_Initializeで自身の動作しているExcel.Applicationを入れているので、
通常は設定する必要がありません。

Public Property Get ExcelApplication() As Excel.Application

現在設定されているExcel.Applicationを取得するプロパティです。

イベント停止(一時的に停止させる)の取得設定
Public Property Let StopEvent(argStop As Boolean)

このクラスを使用するマクロ動作中に、このクラスのイベントを停止させたいときに使うプロパティです。
Trueを設定すると、イベント発生しても何も動作しないようにしています。

Public Property Get StopEvent() As Boolean

イベント停止の設定状態を取得します。

公開メソッド

対象ブック・シートの初期化
Public Sub InitializeBookSheets()

対象ブック・シートの設定を初期設定(クリア)するメソッドです。

対象ブック・シートの設定
Public Function AddBookSheet(ByRef argAry) As Boolean

対象ブック・シートを設定するメソッドです。
1次元配列と2次元配列をサポートしています。
そのため、引数は型をVariantにしています。

このクラスを使うプロシージャーが、対象ブック・シートをどのように用意するかで使い分けられるようにしています。
Array(・・・)なら1次元配列として、必要な回数このメソッドを呼び出します。
セル範囲なら2次元配列をこのメソッドに渡せば1回で複数の設定を入れることができます。
※標準モジュール参照

対象ブック・シートの全取得:2次元配列で戻す
Public Function GetBookSheets() As Variant

このクラスを使うプロシージャーが、
対象ブック・シートの設定状態を取得し確認するためのプロパティです。
VBA開発時のデバッグ等で使用する目的で作成しています。

クラスのメソッド

クラスの初期化
Private Sub Class_Initialize()

クラスのイベントで、クラスのインスタンスが生成(New)されたときに呼び出されます。
クラス内の変数・プロパティの初期化を行います。

クラスの終了処理
Private Sub Class_Terminate()

クラスが解放(オブジェクト変数がNothingに設定)されたときに呼び出されます。
ここでは特にやることもないので、
クラス内で変数に保持しているExcel.Applicationを解放しています。

Applicationのブックイベント

ブックが開かれたときに発生
Private Sub xlApp_WorkbookOpen(ByVal wb As Workbook)

オブジェクト変数xlApp(Excel.Application)内で、ブックが開かれたとき発生するイベントです。

ブックが閉じられる直前に発生
Private Sub xlApp_WorkbookBeforeClose(ByVal wb As Workbook, Cancel As Boolean)

オブジェクト変数xlApp(Excel.Application)内で、ブックが閉じられたとき発生するイベントです。

新しいブックが作成されたときに発生
Private Sub xlApp_NewWorkbook(ByVal wb As Workbook)

オブジェクト変数xlApp(Excel.Application)内で、ブックが新規作成されたとき発生するイベントです。

Applicationのシートイベント

シートがアクティブになったときに発生
Private Sub xlApp_SheetActivate(ByVal Sh As Object)

オブジェクト変数xlApp(Excel.Application)内で、アクティブシートが移ったとき発生するイベントです。

ワークシートのセルが変更されるたときに発生
Private Sub xlApp_SheetChange(ByVal Sh As Object, ByVal Target As Range)

オブジェクト変数xlApp(Excel.Application)内で、セルが変更されたとき発生するイベントです。

セルがダブルクリックされたときに発生
Private Sub xlApp_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)

オブジェクト変数xlApp(Excel.Application)内で、セルがダブルクリックされたとき発生するイベントです。

非公開メソッド

対象ブックの判定
Private Function CheckBook(ByVal wb As Workbook) As Boolean

引数で指定されたブックが、対象ブック・シートの配列に存在するかどうかを判定します。
存在したときにはTrueを返し、存在しないときにはFalseを返します。

構造体(typeBookSheets)の配列(pBookSheets)内をループ検索します。
構造体のBookが対象ブック名で、Sheets(0)が空文字の場合がブックイベントに対する指定になります。
名称はLike演算子を使って比較しています。

対象シートの判定
Private Function CheckSheet(ByVal ws As Worksheet) As Boolean

引数で指定されたシートが、対象ブック・シートの配列に存在するかどうかを判定します。
存在したときにはTrueを返します。

引数はシートオブジェクトなので、.Parentプロパティを使って親であるブックオブジェクトを取得しています。

構造体(typeBookSheets)の配列(pBookSheets)内をループ検索します。
構造体のBookが対象ブック名、Sheets()がシート名と一致している場合に対象となります。
名称はLike演算子を使って比較しています。

配列の次元数取得とエラー値判定
Private Function GetDimension(ByVal argAry) As Long

引数argAryの配列の次元を求め、数値で返します。
1次元2次元配列の場合は、エラー値が含まれていないかのチェックも行っています。

配列以外やエラー値が含まれるときは0を返します。


標準モジュールでのクラスの使い方

クラスを使う場合のサンプルになります。

Option Explicit

Private myClass As clsEvent

Public Sub StartEventClass()
  'クラスのインスタンス
  Set myClass = New clsEvent
  'Excel.Applicationを設定(同一Appなら設定不要)
  Set myClass.ExcelApplication = Application
  'ブック・シートの指定を初期化、不要だが記述説明の意味で
  myClass.InitializeBookSheets
  'イベント発生停止、不要だが記述説明の意味で
  myClass.StopEvent = True
  
  '***** シートから設定する場合 *****
  Dim myArray
  With ThisWorkbook.Worksheets(1).Range("A1")
    If .CurrentRegion.Rows.Count > 1 Then
      myArray = Intersect(.CurrentRegion, .CurrentRegion.Offset(1))
      'シート入力なのでエラー判定
      If Not myClass.AddBookSheet(myArray) Then
        MsgBox "シートにエラー値があります。"
        Set myClass = Nothing
        Exit Sub
      End If
    End If
  End With
  
  '***** 配列を直書きして設定する場合 *****
  'ブック,シート1,シート2,…シート省略時はブックイベント
  Call myClass.AddBookSheet(Array("Book4"))
  Call myClass.AddBookSheet(Array("*", "Sheet7"))
  
  '確認のため設定内容をイミィディエイトに出力
  Call checkBookSheets
  
  'イベント発生再開
  myClass.StopEvent = False
End Sub

'クラスに指定したブック・シートを配列で受けとる
Sub checkBookSheets()
  Dim i1 As Integer
  Dim i2 As Integer
  Dim sTemp As String
  Dim myArray
  myArray = myClass.GetBookSheets
  For i1 = 0 To UBound(myArray)
    sTemp = myArray(i1, 0)
    For i2 = 1 To UBound(myArray, 2)
      sTemp = sTemp & " , " & myArray(i1, i2)
    Next
    Debug.Print sTemp
  Next
End Sub

Private myClass As clsEvent
モジュールレベル変数として、クラスの変数宣言をしています。

StartEventClassがメインのプロシージャーです。
Set myClass = New clsEvent
クラスのインスタンスを作成しています。
モジュールレベル変数宣言時にNewしても構いません。

checkBookSheetsは、ブック・シートの指定が正しくできているかを確認するためのものです。
主な作成目的は、クラス作成時のデバッグ用途になります。


アプリケーションのイベント一覧と調べ方

アブリケーションのイベント一覧

名前 説明
AfterCalculate 中断中の更新作業(同期と非同期の両方)と結果の計算作業がすべて完了すると、AfterCalculateイベントが発生します。
NewWorkbook 新しいブックを作成したときに発生します。
ProtectedViewWindowActivate [保護されたビュー]ウィンドウがアクティブになったときに発生します。
ProtectedViewWindowBeforeClose [保護されたビュー]ウィンドウまたは[保護されたビュー]ウィンドウ内のブックを閉じる直前に発生します。
ProtectedViewWindowBeforeEdit 指定した[保護されたビュー]ウィンドウでブックの編集が有効になる直前に発生します。
ProtectedViewWindowDeactivate [保護されたビュー]ウィンドウが非アクティブになったときに発生します。
ProtectedViewWindowOpen ブックを[保護されたビュー]ウィンドウで開いたときに発生します。
ProtectedViewWindowResize [保護されたビュー]ウィンドウのサイズを変更したときに発生します。
SheetActivate シートがアクティブになったときに発生します。
SheetBeforeDoubleClick 既定のダブルクリックの操作の前に、ワークシートをダブルクリックしたときに発生します。
SheetBeforeRightClick 既定の右クリックの操作の前に、ワークシートを右クリックしたときに発生します。
SheetCalculate ワークシートを再計算したり、グラフでデータをプロットして変更した後に発生します。
SheetChange ユーザーまたは外部リンクにより、ワークシートのセルが変更されるときに発生します。
SheetDeactivate シートが非アクティブになったときに発生します。
SheetFollowHyperlink Excelのハイパーリンクをクリックすると発生します。
ワークシートレベルでのイベントについては、FollowHyperlinkイベントのヘルプトピックを参照してください。
SheetPivotTableAfterValueChange ピボットテーブル内のセルまたはセル範囲が編集または再計算された後に発生します(数式を含むセルの場合)。
SheetPivotTableBeforeAllocateChanges ピボットテーブルに変更が適用される前に発生します。
SheetPivotTableBeforeCommitChanges ピボットテーブルのOLAPデータソースに対する変更が適用される前に発生します。
SheetPivotTableBeforeDiscardChanges ピボットテーブルに対する変更が破棄される前に発生します。
SheetPivotTableUpdate ピボットテーブルレポートのシートが更新された後に発生します。
SheetSelectionChange いずれかのワークシートで選択範囲を変更したときに発生します。
選択範囲がグラフシート上にある場合は発生しません。
WindowActivate ブックのウィンドウがアクティブになったときに発生します。
WindowDeactivate ブックのウィンドウが非アクティブになったときに発生します。
WindowResize ブックのウィンドウサイズを変更したときに発生します。
WorkbookActivate ブックがアクティブになったときに発生します。
WorkbookAddinInstall ブックがアドインとして組み込まれたときに発生します。
WorkbookAddinUninstall アドインブックの組み込みを解除したときに発生します。
WorkbookAfterSave ブックが保存された後に発生します。
WorkbookAfterXmlExport MicrosoftOfficeExcelがデータを保存するか、指定されたワークブックからXMLデータをエクスポートした後で発生します。
WorkbookAfterXmlImport 既存のXMLデータ接続が更新されたか、または開いているMicrosoftExcelブックに新しいXMLデータがインポートされた後に発生します。
WorkbookBeforeClose 開いたブックを閉じる直前に発生します。
WorkbookBeforePrint 開いているブックを印刷する前に発生します。
WorkbookBeforeSave 開いているブックを保存する前に発生します。
WorkbookBeforeXmlExport MicrosoftOfficeExcelがデータを保存するか、指定されたワークブックからXMLデータをエクスポートする前に発生します。
WorkbookBeforeXmlImport 既存のXMLデータ接続が更新されるか、または開いているMicrosoftExcelブックに新しいXMLデータがインポートされる前に発生します。
WorkbookDeactivate 開いているブックが非アクティブになったときに発生します。
WorkbookNewChart 開いているブックで新しいグラフが作成されるときに発生します。
WorkbookNewSheet 開いているブックで新しいシートが作成されるときに発生します。
WorkbookOpen ブックを開くときに発生します。
WorkbookPivotTableCloseConnection ピボットテーブルレポート接続が閉じた後に発生します。
WorkbookPivotTableOpenConnection ピボットテーブルレポート接続が開いた後に発生します。
WorkbookRowsetComplete ユーザーがOLAPピボットテーブルで行セットアクションを起動するか、レコードセットを詳細表示するとWorkbookRowsetCompleteイベントが発生します。
WorkbookSync ドキュメントワークスペースに含まれているブックのローカルコピーがサーバー上のコピーと同期されたときに発生します。

引数については、以下のイベントの調べ方を参考にして使用するイベントについて調べてください。

アプリケーションのイベントの調べ方

オブジェクトブラウザーで、クラスでApplicationを選択

マクロ VBA クラス

カミナリのアイコンがイベントになります。
メンバーの中から使用したいイベントを選択、

マクロ VBA クラス

一番下に以下のように
表示されます。

マクロ VBA クラス

この画像で選択している部分をコピペしてVBAに貼り付けてください。
そして、

SheetChange(Sh As Object, Target As Range)

Private xlApp_SheetChange(Byval Sh As Object, Target As Range)

VBAに貼り付けたあと、太字を追加します。
先頭にPrivateを書いて、
WithWithEventsキーワードを付けた変数(xlApp)に_(アンダバー)を付けます。
つまり、
WithWithEvents変数_イベント名
このようにします。
そして、wbやshtのオブジェクトにはByvalを付けてください。
これを付けないと、以下のエラーが出てしまいます。
つまり省略のByRefではだめだということです。

マクロ VBA クラス


最後に

以上が、クラスを使った他ブックのイベント補足方法になります。

先にも書きましたが、

クラスでのプロパティ・メソッドの実装方法
WithEventsの使い方

これらを中心にVBAコードを読んで参考にしてください。




同じテーマ「VBAクラス入門」の記事

VBAクラス入門:クラスとは?オブジェクト指向とは?

・オブジェクトとは ・オブジェクト指向とは ・カプセル化 ・オブジェクト指向とカプセル化とクラス ・クラスの必要性と利点 ・一般的なクラスに関する説明 ・クラスの比喩的説明 ・クラスの使い方 ・クラスを体験してみる ・クラスの使用例 ・クラス入門の最後に
クラスを使った全ブック(他ブック)のイベント補足
VBAクラスの作り方:列名の入力支援と列移動対応
・列挙体を使った列名表示の例 ・構造体を使った列名表示の例 ・クラスに関する基本のおさらい ・全体の機能と構成 ・シートに名前定義を設定 ・クラスを新規挿入 ・クラスに列数取得のプロシージャーと対象シートを受け取るプロパティを作成 ・クラスに列名のプロパティを作成 ・クラスの完成コード ・最後に
VBAクラスの作り方:列名のプロパティを自動作成する
・前回のVBAクラスの完成コード ・全体の機能と構成 ・クラスで、列名の入力支援と列移動対応するための手順 ・作成済のクラス(clsColumn)をエクスポートして雛形にする ・シートの列タイトルからクラスファイル(.cls)を出力 ・クラスファイル(.cls)のインポート ・全てを連続実行できるように変更 ・列番号のプロパティを自動作成するVBAの完成コード ・最後に
VBAクラスの作り方:独自Rangeっぽいものを作ってみた
・クラスの全VBAコード ・サンプルとして使うブックの構成 ・標準モジュールでの使い方 ・最後に
クラスとイベントとマルチプロセス並列処理
・クラスとイベントとマルチプロセス並列処理の概要 ・VBAの全コード ・まとめと感想 ・最後に
クラスとCallByNameとポリモーフィズム(多態性)
・CallByName関数 ・クラスとCallByNameとポリモーフィズム(多態性)のVBAコード ・オブジェクト(クラス)も動的に変更すると ・最後に
オートフィルターを退避回復するVBAクラス
・オートフィルターに関するページ ・オートフィルターを退避回復するVBAクラスの概要 ・オートフィルターを退避し回復するクラスのVBAコード ・クラスを利用する標準モジュールのVBAコード ・処理の要点と解説 ・最後に
オートフィルター退避回復クラスを複数シート対応させるVBAクラス
・オートフィルタ退避回復クラスを複数シート対応させるVBAクラスのコード ・クラスを利用する標準モジュールのVBAコード ・最後に
コレクション(Collection)の並べ替え(Sort)に対応するクラス
・コレクション(Collection)の並べ替え(Sort)に対応する方法 ・コレクションの並べ替えに対応するクラスのVBAコード ・コレクションの並べ替えに対応するクラスの使い方 ・コレクションの並べ替えに対応するクラスの実行時間 ・最後に
VBAクラスのAttributeについて(既定メンバーとFor Each)
・VBAクラスのエクスポートとインポート ・Attribute VB_PredeclaredId ・Attribute VB_Exposed ・Attribute [procName.]VB_Description ・Attribute variableName.VB_VarUserMemId ・Attribute procName.VB_UserMemId = 0 ・Attribute procName.VB_UserMemId = -4 ・VBAクラスのAttributeの最後に


新着記事NEW ・・・新着記事一覧を見る

VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
累計を求める数式あれこれ|エクセル関数応用(2024-01-22)
複数の文字列を検索して置換するSUBSTITUTE|エクセル入門(2024-01-03)
いくつかの数式の計算中にリソース不足になりました。|エクセル雑感(2023-12-28)
VBAでクリップボードへ文字列を送信・取得する3つの方法|VBA技術解説(2023-12-07)
難しい数式とは何か?|エクセル雑感(2023-12-07)
スピらない スピル数式 スピらせる|エクセル雑感(2023-12-06)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.変数宣言のDimとデータ型|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.並べ替え(Sort)|VBA入門
8.条件分岐(IF)|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.マクロとは?VBAとは?VBAでできること|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ