Excelの埋め込みグラフのシリーズを押したときにテキストボックスにシリーズの説明をさせたい。そんなニーズに向けたVBAです。
グラフシートであれば、シートに用意されているChart_Selectイベントが使えるのでそこまでは難しくありません。ところが埋め込みイベントの場合は、一工夫必要になります。
今回は、Classを使って埋め込みグラフにChart_Selectを発生させるやり方です。
動作イメージ
円グラフでシリーズをクリックしたときに、それに対応したメッセージをテキストボックスに表示させるものです。
サイトなんかでは有りそうな動作ですが、エクセルだとVBAでやる必要があります。

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

クラスモジュール
クラスモジュールを追加し、クラスを作成します。
これを標準モジュールで呼び出します。
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を使うことができません。このため、クラスモジュールを使用しています。
汎用性を上げるには、更に一工夫必要になります。
標準モジュール
標準モジュールを追加し、コードを記載していきます。
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のイベント
このワークブックが開いたときに、先ほどの標準モジュールのサブルーチンを実行させることで、埋め込みグラフへのイベントを有効化させています。
Private Sub Workbook_Open()
Call InitializeChartEvents
End Sub
カスタマイズしてお使いください。
WithEventsは色々と応用が利きそうですね。
コメント