☆Yuus Memo☆
非エンジニアの方でも業務を効率化できるプログラムを紹介します!
VBA

【VBA】グラフのイベント

皆さんこんにちは!!
今回はかなりコアな内容で、VBA上級者の方でもあまり使ったことがないであろう、「VBAでのグラフイベント操作」を取り上げたいと思います。

グラフを描画したり、ピボットテーブルをVBAから描画するコードは色々なサイトで見かけますし、実際に使用されている方も多いかと思います。

かなり、上級者向けの内容なので分からない部分があれば、コメントください。

VBAのイベントについては当ブログでも以下のページなどで解説しています。
ちょっと難しい内容も含まれていますが、併せてご覧ください。

EXCEL_VBA_EVENT
【VBA】イベントについて皆さんは、VBAでイベント というものを、使っていますか?イベントは、エクセルをアプリケーションライクに使用する上で、とても大切です。 ...

グラフイベントの基本

まずは、実用性は皆無ですが、グラフがアクティブになった際にメッセージボックスで、グラフのオブジェクト名を出力するコードを書きます。

プログラムの実装

まず、新規ExcelBookを作成して、標準モジュールに下記コードを転記してください。

Option Explicit

Dim myChtCls As New ChartEventCls

Sub InitializeChartEvent()
    Set myChtCls.myCht = Worksheets(1).ChartObjects(1).Chart
End Sub

続けて、クラスモジュールを一つ挿入し、オブジェクト名を「ChartEventCls」として、下記のコードを転記してください。

Option Explicit

Public WithEvents myCht As Chart

Private Sub myCht_Activate()
    MsgBox Me.myCht.Name & "がActiveになりました。"
End Sub

続けてThisWorkbookのOpenイベントで標準モジュールの、InitializeChartEvent()メソッドを呼び出すようにします。

Option Explicit

Private Sub Workbook_Open()
    Call InitializeChartEvent
End Sub

コードの準備は終わったので、あとはシートに下図の様な適当なグラフを用意してください。
※どんなグラフでも良いです。

Excelブックを保存し、ファイルを開きなおしてください。
グラフをクリックすると、

「Sheet1グラフ1がActiveになりました。」

と、イベントでメッセージが出力されたかと思います。

グラフ操作のイベントをキャッチできたことが分かったかと思います。

簡単な解説

イベントをハンドル出来たことは、皆さん分かったかと思いますが、何が起こったのか、よく分からないかと思いますので、簡単に解説します。

まず、一番大切なクラスモジュールのコードです。
大切なので、もう一度コードを載せます。

Public WithEvents myCht As Chart

Private Sub myCht_Activate()
    MsgBox Me.myCht.Name & "がActiveになりました。"
End Sub

ここで、大切なのは「WithEvents」の部分になります。
WithEventsについては、この記事で解説しているので分からない方は読んでください。

WithEventsを付けてChartオブジェクトを宣言することで、Chartオブジェクトを自由にハンドル出来るようになります。

基本的に「WithEvents」の動作が分からなければ、理解できないので必ずこの記事を読んでください。

クラスの意味が理解できれば後は簡単です。

クラスは、インスタンス化しなければ使用できないので、標準モジュールの下記のコードで、インスタンス化してやります。

Dim myChtCls As New ChartEventCls

Sub InitializeChartEvent()
    Set myChtCls.myCht = Worksheets(1).ChartObjects(1).Chart
End Sub

今回は、パブリック変数を「ChartEventCls」型として宣言しておいて、InitializeChartEvent()メソッドで、Sheetインデックス1番目(一番左のシート)の、1番目のグラフオブジェクトを代入しインスタンス化しています。

今回はサンプルを分かりやすくするために、1つのグラフオブジェクトを、べた書きしましたが、InitializeChartEvent()の書き方を変えれば、複数のグラフオブジェクトに同一のイベントを持たせることが出来ます。

この辺りは以前【UserFormで動的にコントロールを追加】という以下の記事で書いた内容と大体同じです。

VBA ユーザーフォーム
【VBAユーザーフォーム:動的にコントロールを追加する】皆さんの中に、ExcelVBAのフォームで、コントロールを動的に作成していくことってできないのかなと考えている方がいるかもしれません。 ...

ThisWorkbookのOpenイベントは、単純にBookを開いた段階で、インスタンス化を行うために作りました。

正直、標準モジュールを手動で実行していただいても問題ありません。
ただ、InitializeChartEvent()メソッドを未実行の場合、グラフがアクティブになってもイベントはハンドル出来ません。

まとめ

今回の記事で、本当はもっと複数のグラフイベントを扱うつもりだったのですが、概念が入門書には無いレベルで難しくなってしまうので、今回は「基礎編」という位置づけで、記事を分けることにしました。
近々、続きの応用記事を書きます。

グラフやピボットテーブルのイベントを使いこなすと、UserFormを使いこなす以上に、ユーザーフレンドリーなシステムを構築できます。

業務で使用する帳票には、グラフやピボットテーブルなどが複数含まれ、集計表自体が複雑で項目が多いことが多いです。

そんな集計表を、グラフのイベントを使いこなす事で見やすい且つ使いやすいエクセル表に作り替える事ができるので、皆さんも是非、マスターしてください!!

最後までお読みいただき、ありがとうございました!!


VBAを体系的に学びたい方必見!!

現在出版されている「EXCEL VBA」の書籍ジャンルの中で唯一、上級者向けの書籍です。

今回の記事で紹介している内容は含まれていませんが、クラスやコレクションを扱う部分なども取り上げているので、初心者を脱したい方や、他の言語へのステップアップを考えている方は、足掛かりとして読んでみてください。


コメントを残す