VBA グラフ イベント
グラフの中にプロットされたデータをクリックするとイベントが発動して、
クリックしたデータの値を取得するサンプルコードです。
画面上の "Download" のリンクをクリックして落としてください。
Step1. イベントを作成します。
クラス モジュール ChartEvent を新規作成します。
作成したクラスモジュールに、イベントの処理を記述していきます。
ここでは ChartEvent クラスとしています。
クラスモジュール 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 オブジェクトをイベントに登録
標準モジュール 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. ファイルを開いたときにイベントが起動するようにする。
Option Explicit Private Sub Workbook_Open() Call SetCurrentChart End Sub