VBA グラフ イベント

グラフの中にプロットされたデータをクリックするとイベントが発動して、
クリックしたデータの値を取得するサンプルコードです。
画面上の "Download" のリンクをクリックして落としてください。
 

Book1.xlsm - Google ドライブ
 

f:id:domodomodomo:20150811093407p:plain



Step1. イベントを作成します。

クラス モジュール ChartEvent を新規作成します。


f:id:domodomodomo:20150811092234p:plain

 

作成したクラスモジュールに、イベントの処理を記述していきます。
ここでは ChartEvent クラスとしています。


f:id:domodomodomo:20140717124850p:plain

クラスモジュール ChartEvent

Option Explicit

'
' このコードの xvalue, value に、
' それぞれクリックしたデータの x成分, y成分が格納されます。
'

' Step1-1.
' ここで指定された Chart オブジェクトに対して
' イベントが発生します。
Public WithEvents target As Chart

' Step1-2. イベントの処理を記述しましょう。
' クリックされたときに呼び出されるサブプロシージャです。
' この引数には何がはいってくるのか、正直よくわかってません...。
Private Sub target_MouseDown( _
        ByVal Button As Long, _
        ByVal Shift As Long, _
        ByVal x As Long, _
        ByVal y As Long _
    )
    
    ' GetChartElement メソッドを用いてイベントが発生した ChartElement を取得します。
    ' x, y を引数にして
    ' ElemID, Arg1, Arg2 にはイベントが発生した ChartElement の情報が格納されます。
    '
    ' 例えば、散布図などでデータを1つクリックした場合は
    '  ElemID = xlSeries       => ElementID の値, クリックした ID の型みたいなものですかね。
    '  Arg1   = SeriesIndex    => 何番目のグラフをクリックしたか。
    '  Arg2   = PointIndex     => グラフの中で何番目のデータか。
    ' となります。
    Dim ElemID As Long, Arg1 As Long, Arg2 As Long
    Call ActiveChart.GetChartElement(x, y, _
            ElemID, _
            Arg1, _
            Arg2 _
     )

    ' 変数ElemIDに格納されたElementIDにより処理を分岐
    Dim xvalue As Double ' クリックしたX軸成分の値
    Dim value As Double  ' クリックしたY軸成分の値
    Dim clickedSeriesXValues, clickedSeriesValues As Variant
    Select Case ElemID
        Case xlSeries 'データをクリックした場合
            clickedSeriesXValues = ActiveChart.SeriesCollection(Arg1).XValues
            clickedSeriesValues = ActiveChart.SeriesCollection(Arg1).Values
            
            ' これで取得できました。
            xvalue = clickedSeriesXValues(Arg2)
            value = clickedSeriesValues(Arg2)

            ' なお次のように直接アクセスはできない様子。
            ' xvalue = ActiveChart.SeriesCollection(Arg1).XValues(Arg2)
            ' value = ActiveChart.SeriesCollection(Arg1).Values(Arg2)
            
            Call MsgBox(xvalue & " " & value)
            
        Case Else
        'その他の処理
    End Select
End Sub

 

Step2. Chart オブジェクトをイベントに登録


f:id:domodomodomo:20150811092252p:plain

標準モジュール Module1

' Step2-1. 作ったイベントのオブジェクトを生成してあげましょう。
Private ce As New ChartEvent

Sub SetCurrentChart()
    ' Step2-2. イベントに登録したい Chart オブジェクトを取得します。
    Dim c As Chart
    Set c = ActiveSheet.ChartObjects(1).Chart
    
    ' Step2-3. イベントに Chart オブジェクトを登録させてあげましょう。
    Call setChart(c)

End Sub


Public Sub setChart(ByVal c As Chart)
    Set ce.target = c
End Sub

 

Step3. ファイルを開いたときにイベントが起動するようにする。


f:id:domodomodomo:20151128234043p:plain

Microsoft Excel オブジェクト

Option Explicit

Private Sub Workbook_Open()
  Call SetCurrentChart
End Sub