最終更新日:2019-12-28クラスを使った全ブック(他ブック)のイベント補足VBAでイベントを使う場合は、通常はイベントが発生するオブジェクト(ブックやシート等)のモジュールに記載します、つまり、各ブックの中にマクロを入れなければなりません。開いている全ブックまたは、他の特定のブックのイベントを処理するには、WithEventsキーワードを付けた変数宣言を使います、クラスを使って全ブックまたは他ブックのイベントを補足する方法について具体的なVBAコードで紹介します。他ブック(全ブック)のイベントを補足するだけなら、クラスを使わなくても、ThisWorkbookにWithEventsキーワードを付けた変数宣言をする方法で可能です。こまような処理の場合にはクラスを使ったほうが保守や拡張がしやすくなると思います。クラスの基本と、イベントについては以下を参照してください。VBAのクラスとは(Class,Property)VBAを覚えて、いろいろ作りながらネットで調べたりしていると、クラスとかオブジェクト指向といった言葉に出くわします。VBEの「挿入」の一番下にある「クラスモジュール」は気になっていたかもしれません。このクラスモジュールを使ってクラスを作ります。WorkbookのイベントプロシージャーWorkbookのイベントプロシージャーは、ブックに対し特定の操作(これがイベント)が行われた時に実行されます。イベントは、手動でもVBAでも、どちらで操作が行われても発生します。Workbookのイベントは多数用意されています。WorksheetのイベントプロシージャーWorksheetのイベントプロシージャーは、ワークシートまたはそのセルに対し特定の操作(これがイベント)が行われた時に実行されます。イベントは、手動でもVBAでも、どちらで操作が行われても発生します。Worksheetのイベントプロシージャーの一覧紹介と主要なイベントについて解説します。2019/05/15からの「VBAエキスパート」リニューアルに伴い出題範囲から削除されました。VBAをやっていくうえで、イベントは必ず覚えなければならないものです。試験は別として、必ず学習することをお勧めいたします。今回の場合は、開いている全ブックのイベントを補足したいので、Applicationにあるブックやシートのイベントを使用します。これについての詳細は後述します。WithEventsキーワードWithEventsキーワードは、次の構文で使用します。ステートメント変数がイベントに対応するためのオブジェクト変数であることを指定するキーワードです。オブジェクトのモジュールのみで使えます、つまり、標準モジュールでは使用できません。WithEventsは任意の数の変数に宣言できます。WithEventsでは配列は作成できません。キーワードNewとWithEventsは一緒には使用できません。Excel.Applicationこのように、WithEventsとNewは分けて使わなければなりません。何らかの処理(ここではメッセージボックスを表示して補足できている事のみ確認)を行えるようにしています。イベントを補足するブック・シートを指定して対象を絞れるようにしています。何も指定しない場合は、全てのブック・シートが対象になります。クラスを作成するブックの全体構成ブック任意の名称のマクロ有効ブック(.xlsm)シート先頭シートを対象ブック・シートの指定に使用これはクラスの動作確認用に使うものです。クラスを起動する標準モジュールのプロシージャーで使用しています。上図であれば、以下が対象となります。・Book2のブックイベント・Book*のSheet2,Sheet3のシートのイベント・全てのブックのSheet5*のシートのイベントブック名・シート名ともに、Like演算子で有効なワイルドカードが使用できます。クラスモジュールオブジェクト名:clsEventオブジェクト名を変更する場合は、標準モジュールの変数宣言も変更してください。checkBookSheets()プロシージャー名は任意に変更して構いません。この標準モジュールは、あくまでクラスの動作確認用で作成したものです。Function以下のVBAコードの解説で簡単に説明しています。個々のステートメントについての詳細までは解説していません。VBA内のコメントを頼りに読み解いてください。実際に動かして、ブレークポイントで止めたりしながら動作確認してみてください。クラスでのプロパティ・メソッドの実装方法や、WithEventsの使い方を中心にVBAコードを読んでください。Excel.Applicationイベントに対応するためのオブジェクト変数の定義です。構造体のメンバーはBookとSheets()になります。Bookはプック名をいれ、Sheets()は、シート名を強い列で入れます。構造体typeBookSheetsを型に持つ配列を定義しています。pCntBSは、配列の現在要素数のカウントに使用します。Booleanマクロ動作でブックやシートの変更を行ってもイベントが発生します。そのような場合に、この変数をFalseにすることでその間のイベント発生を停止できるようにしています。Falseこちらを使っても良いでしょう、この場合はこのクラスだけではなく全てのイベントが抑止されます。Excel.Application)このクラスの対象となるExcel.Applicationを設定するプロパティです。通常は設定する必要がありません。Excel.Application現在設定されているExcel.Applicationを取得するプロパティです。Boolean)このクラスを使用するマクロ動作中に、このクラスのイベントを停止させたいときに使うプロパティです。Trueを設定すると、イベント発生しても何も動作しないようにしています。Booleanイベント停止の設定状態を取得します。InitializeBookSheets()対象ブック・シートの設定を初期設定(クリア)するメソッドです。Boolean対象ブック・シートを設定するメソッドです。1次元配列と2次元配列をサポートしています。そのため、引数は型をVariantにしています。このクラスを使うプロシージャーが、対象ブック・シートをどのように用意するかで使い分けられるようにしています。Array(・・・)なら1次元配列として、必要な回数このメソッドを呼び出します。セル範囲なら2次元配列をこのメソッドに渡せば1回で複数の設定を入れることができます。対象ブック・シートの設定状態を取得し確認するためのプロパティです。VBA開発時のデバッグ等で使用する目的で作成しています。Class_Initialize()クラスのイベントで、クラスのインスタンスが生成(New)されたときに呼び出されます。クラス内の変数・プロパティの初期化を行います。Class_Terminate()クラスが解放(オブジェクト変数がNothingに設定)されたときに呼び出されます。ここでは特にやることもないので、クラス内で変数に保持しているExcel.Applicationを解放しています。Workbook)オブジェクト変数xlApp(Excel.Application)内で、ブックが開かれたとき発生するイベントです。Boolean)オブジェクト変数xlApp(Excel.Application)内で、ブックが閉じられたとき発生するイベントです。Workbook)オブジェクト変数xlApp(Excel.Application)内で、ブックが新規作成されたとき発生するイベントです。Object)オブジェクト変数xlApp(Excel.Application)内で、アクティブシートが移ったとき発生するイベントです。Range)オブジェクト変数xlApp(Excel.Application)内で、セルが変更されたとき発生するイベントです。Boolean)オブジェクト変数xlApp(Excel.Application)内で、セルがダブルクリックされたとき発生するイベントです。Boolean引数で指定されたブックが、対象ブック・シートの配列に存在するかどうかを判定します。存在したときにはTrueを返し、存在しないときにはFalseを返します。構造体(typeBookSheets)の配列(pBookSheets)内をループ検索します。構造体のBookが対象ブック名で、Sheets(0)が空文字の場合がブックイベントに対する指定になります。名称はLike演算子を使って比較しています。Boolean引数で指定されたシートが、対象ブック・シートの配列に存在するかどうかを判定します。存在したときにはTrueを返します。引数はシートオブジェクトなので、.Parentプロパティを使って親であるブックオブジェクトを取得しています。構造体(typeBookSheets)の配列(pBookSheets)内をループ検索します。構造体のBookが対象ブック名、Sheets()がシート名と一致している場合に対象となります。名称はLike演算子を使って比較しています。Long引数argAryの配列の次元を求め、数値で返します。1次元2次元配列の場合は、エラー値が含まれていないかのチェックも行っています。配列以外やエラー値が含まれるときは0を返します。標準モジュールでのクラスの使い方クラスを使う場合のサンプルになります。"シートにエラー値があります。clsEventモジュールレベル変数として、クラスの変数宣言をしています。StartEventClassがメインのプロシージャーです。clsEventクラスのインスタンスを作成しています。モジュールレベル変数宣言時にNewしても構いません。checkBookSheetsは、ブック・シートの指定が正しくできているかを確認するためのものです。主な作成目的は、クラス作成時のデバッグ用途になります。中断中の更新作業(同期と非同期の両方)と結果の計算作業がすべて完了すると、AfterCalculateイベントが発生します。新しいブックを作成したときに発生します。[保護されたビュー]ウィンドウがアクティブになったときに発生します。[保護されたビュー]ウィンドウまたは[保護されたビュー]ウィンドウ内のブックを閉じる直前に発生します。指定した[保護されたビュー]ウィンドウでブックの編集が有効になる直前に発生します。[保護されたビュー]ウィンドウが非アクティブになったときに発生します。ブックを[保護されたビュー]ウィンドウで開いたときに発生します。[保護されたビュー]ウィンドウのサイズを変更したときに発生します。シートがアクティブになったときに発生します。既定のダブルクリックの操作の前に、ワークシートをダブルクリックしたときに発生します。既定の右クリックの操作の前に、ワークシートを右クリックしたときに発生します。ワークシートを再計算したり、グラフでデータをプロットして変更した後に発生します。ユーザーまたは外部リンクにより、ワークシートのセルが変更されるときに発生します。シートが非アクティブになったときに発生します。Excelのハイパーリンクをクリックすると発生します。ワークシートレベルでのイベントについては、FollowHyperlinkイベントのヘルプトピックを参照してください。ピボットテーブル内のセルまたはセル範囲が編集または再計算された後に発生します(数式を含むセルの場合)。ピボットテーブルに変更が適用される前に発生します。ピボットテーブルのOLAPデータソースに対する変更が適用される前に発生します。ピボットテーブルに対する変更が破棄される前に発生します。ピボットテーブルレポートのシートが更新された後に発生します。いずれかのワークシートで選択範囲を変更したときに発生します。選択範囲がグラフシート上にある場合は発生しません。ブックのウィンドウがアクティブになったときに発生します。ブックのウィンドウが非アクティブになったときに発生します。ブックのウィンドウサイズを変更したときに発生します。ブックがアクティブになったときに発生します。ブックがアドインとして組み込まれたときに発生します。アドインブックの組み込みを解除したときに発生します。ブックが保存された後に発生します。MicrosoftOfficeExcelがデータを保存するか、指定されたワークブックからXMLデータをエクスポートした後で発生します。既存のXMLデータ接続が更新されたか、または開いているMicrosoftExcelブックに新しいXMLデータがインポートされた後に発生します。開いたブックを閉じる直前に発生します。開いているブックを印刷する前に発生します。開いているブックを保存する前に発生します。MicrosoftOfficeExcelがデータを保存するか、指定されたワークブックからXMLデータをエクスポートする前に発生します。既存のXMLデータ接続が更新されるか、または開いているMicrosoftExcelブックに新しいXMLデータがインポートされる前に発生します。開いているブックが非アクティブになったときに発生します。開いているブックで新しいグラフが作成されるときに発生します。開いているブックで新しいシートが作成されるときに発生します。ブックを開くときに発生します。ピボットテーブルレポート接続が閉じた後に発生します。ピボットテーブルレポート接続が開いた後に発生します。ユーザーがOLAPピボットテーブルで行セットアクションを起動するか、レコードセットを詳細表示するとWorkbookRowsetCompleteイベントが発生します。ドキュメントワークスペースに含まれているブックのローカルコピーがサーバー上のコピーと同期されたときに発生します。引数については、以下のイベントの調べ方を参考にして使用するイベントについて調べてください。アプリケーションのイベントの調べ方オブジェクトブラウザーで、クラスでApplicationを選択カミナリのアイコンがイベントになります。下に以下のように表示されます。この画像で選択している部分をコピペしてVBAに貼り付けてください。Range)VBAに貼り付けたあと、太字を追加します。先頭にPrivateを書いて、WithWithEventsキーワードを付けた変数(xlApp)に_(アンダバー)を付けます。WithWithEvents変数_イベント名このようにします。wbやshtのオブジェクトにはByvalを付けてください。これを付けないと、以下のエラーが出てしまいます。省略のByRefではだめだということです。最後に以上が、クラスを使った他ブックのイベント補足方法になります。・WithEventsの使い方これらを中心にVBAコードを読んで参考にしてください。Next)|VBA入門7.マクロって何?VBAって何?|VBA入門8.セルに文字を入れるとは(Range,Value)|VBA入門9.空白セルを正しく判定する方法(IsEmpty,IsError,HasFormula)|VBA技術解説10.ひらがな⇔カタカナの変換|エクセル基本操作トップマクロVBAVBAクラス入門クラスを使った全ブック(他ブック)のイベント補足このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。GASスプレッドシート入門スプレッドシート応用GAS入門GAS応用トップマクロVBAVBAクラス入門クラスを使った全ブック(他ブック)のイベント補足このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。