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

未分類
スポンサーリンク

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は色々と応用が利きそうですね。

コメント

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