Loading [MathJax]/jax/output/HTML-CSS/config.js

Excelでグラフのシリーズをクリックして特定の動作をさせる

Excel
スポンサーリンク

Excelの埋め込みグラフのシリーズを押したときにテキストボックスにシリーズの説明をさせたい。そんなニーズに向けたVBAです。

グラフシートであれば、シートに用意されているChart_Selectイベントが使えるのでそこまでは難しくありません。ところが埋め込みイベントの場合は、一工夫必要になります。

今回は、Classを使って埋め込みグラフにChart_Selectを発生させるやり方です。

動作イメージ

円グラフでシリーズをクリックしたときに、それに対応したメッセージをテキストボックスに表示させるものです。
サイトなんかでは有りそうな動作ですが、エクセルだとVBAでやる必要があります。

全体構成

ThisWorkBookのイベント、標準モジュール、クラスモジュールにコードを記載する必要があります。
と言ってもそこまで複雑ではありません。

クラスモジュール

クラスモジュールを追加し、クラスを作成します。
これを標準モジュールで呼び出します。

VBA
Public WithEvents EmbeddedChart As Chart Private Sub EmbeddedChart_Select(ByVal ElementID As Long, ByVal Arg1 As Long, ByVal Arg2 As Long) Dim ws As Worksheet Dim dataSheet As Worksheet Dim selectedText As String ' ワークシートを取得 Set ws = ThisWorkbook.Sheets("Sheet1") ' グラフがあるシート Set dataSheet = ThisWorkbook.Sheets("Sheet1") ' データシート ' データポイントが選択された場合 If ElementID = xlSeries And Arg2 > 0 Then selectedText = dataSheet.Cells(Arg2 + 1, 3).Value 'descriptionにあるテキストを代入 ws.Shapes("TextBox 2").TextFrame2.TextRange.Text = selectedText '指定したテキストボックスに書き込み End If End Sub

WithEventsを使うことで、この場合はChartオブジェクトのイベントを使うことができます
ただし、標準モジュールではWithEventsを使うことができません。このため、クラスモジュールを使用しています。

汎用性を上げるには、更に一工夫必要になります。

標準モジュール

標準モジュールを追加し、コードを記載していきます。

VBA
Option Explicit Dim ChartEvent As CChartEvents 'モジュールレベル変数 Sub InitializeChartEvents() Dim ws As Worksheet Set ws = ThisWorkbook.Sheets("Sheet1") ' グラフがあるシート ' イベントを設定 Set ChartEvent = New CChartEvents Set ChartEvent.EmbeddedChart = ws.ChartObjects("グラフ 1").Chart ' グラフの名前を指定 End Sub

クラスモジュールで宣言したCChartEventsクラスのインスタンスを生成し、グラフに割り付けています。

ThisWorkBookのイベント

このワークブックが開いたときに、先ほどの標準モジュールのサブルーチンを実行させることで、埋め込みグラフへのイベントを有効化させています。

VBA
Private Sub Workbook_Open() Call InitializeChartEvents End Sub

カスタマイズしてお使いください。
WithEventsは色々と応用が利きそうですね。

0

コメント

タイトルとURLをコピーしました