ExcelマクロVBA技術解説
クラスを使って他ブックのイベントを補足する

ExcelマクロVBAの問題点と解決策、エクセルVBAの技術的解説
最終更新日:2019-03-04

クラスを使って他ブックのイベントを補足する


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


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

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

クラスの基本と、イベントについては以下を参照してください。
VBAのクラスとは(Class,Property)
VBAを覚えていろいろ作りながらネットで調べたりしているとクラスやらオブジェクト指向やらという言葉に出くわします。いくら言葉を尽くしてもこれらクラスやオブジェクト指向を完全に説明しつくすことは難しいと思われます。オブジェクトとは 操作対象の事ですと説明されたりしますがまずは何かの物体つまりは対象物と理解すれば良いでしょう。

Workbookのイベントプロシージャー
Workbookのイベントプロシージャーは、ブックに対し特定の操作(これがイベント)が行われた時に実行されます。イベントは、手動でもVBAでも、どちらで操作が行われても発生します。Workbookのイベントは多数用意されています。
Worksheetのイベントプロシージャー
Worksheetのイベントプロシージャーは、ワークシートまたはそのセルに対し特定の操作(これがイベント)が行われた時に実行されます。イベントは、手動でもVBAでも、どちらで操作が行われても発生します。Worksheetのイベントプロシージャーの一覧紹介と主要なイベントについて解説します。
VBAスタンダード:イベント
・イベントとは ・ブックのイベント ・シートのイベント 2019/05/15からの「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のクラスとは(Class,Property,Get,Let,Set)
クラスを使って他ブックのイベントを補足する
VBAクラスの作り方:列名の入力支援と列移動対応
VBAクラスの作り方:列名のプロパティを自動作成する
VBAクラスの作り方:独自Rangeっぽいものを作ってみた
クラスとイベントとマルチプロセス並列処理
クラスとCallByNameとポリモーフィズム(多態性)
オートフィルタを退避回復するVBAクラス
オートフィルタ退避回復クラスを複数シート対応させるVBAクラス
コレクション(Collection)の並べ替え(Sort)に対応するクラス


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

VBAのマルチステートメント(複数のステートメントを同じ行に)|VBA技術解説(10月14日)
VBAコードの全プロシージャー・プロパィ一覧を取得|VBAサンプル集(10月12日)
VBAでエラー行位置(行番号)を取得できるErl関数|VBA技術解説(10月11日)
手動計算時の注意点と再計算方法|ExcelマクロVBA技術解説(10月9日)
引数の数を可変にできるパラメーター配列(ParamArray)|VBA入門(10月7日)
VBEの使い方:デバッグ|ExcelマクロVBA入門(10月6日)
VBAにおける配列やコレクションの起点について|VBA技術解説(10月5日)
VBEの使い方:オブジェクト ブラウザー|VBA入門(10月5日)
VBEの使い方:ウォッチ ウィンドウ|VBA入門(10月4日)
VBEの使い方:ローカル ウィンドウ|VBA入門(10月3日)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|ExcelマクロVBA入門
4.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
5.変数とデータ型(Dim)|ExcelマクロVBA入門
6.繰り返し処理(For Next)|ExcelマクロVBA入門
7.マクロって何?VBAって何?|ExcelマクロVBA入門
8.ひらがな⇔カタカナの変換|エクセル基本操作
9.空白セルを正しく判定する方法(IsEmpty,IsError,HasFormula)|VBA技術解説
10.セルに文字を入れるとは(Range,Value)|VBA入門



  • >
  • >
  • >
  • クラスを使って他ブックのイベントを補足する

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


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




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