- 締切済み
EXCEL散布図のマーカーのクリック
Excelの散布図について質問させてください。 散布図上のマーカーにマウスを移動させると系列や座標値がコメント表示されますが、たとえばマーカーのクリックをトリガとして、「データー」一覧シートの所定の行を表示させるようなアプリケーションを作りたいと思っています。 Excelでは、ユーザによるマーカー選択情報を取得するようなことは実現できないのでしょうか?
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- HohoPapa
- ベストアンサー率65% (455/693)
出来合いの『Excelの散布図』では厳しいと思います。 少なくとも私には実現できません。 私だったら、 出来合いの『Excelの散布図』を使わず、 自前で図形を配置し、見掛け上『Excelの散布図』にします。 参考になりそうなコードを後記しますので よかったら試してみてください。 なお、詳しくはコードを読んでください。 Option Explicit '//-------------- 散布図用ドット描写 Sub TestX() Dim Sh As Worksheet '作成先シート Dim Nm As String '図形名 Dim Bx As Double '開始横位置 Dim By As Double '開始縦位置 Dim Hi As Double '高さ Dim Wi As Double '幅 Dim Cr As Long '色 Dim r As Long Set Sh = ThisWorkbook.Sheets("Work") Hi = 4 Wi = 4 Cr = rgbRed For r = 2 To 8 Nm = Sh.Cells(r, 1).Value Bx = Sh.Cells(r, 2).Value + 300 By = Sh.Cells(r, 3).Value MakeBelt Sh, Nm, Bx, By, Hi, Wi, Cr Next r End Sub '//-------------- 散布図用ドットがクリックされた時の処理 Sub ExShapeClick() Dim kname As String Dim r As Long kname = Application.Caller r = 2 With ThisWorkbook.Sheets("work") Do If .Cells(r, 1).Value = "" Then Exit Do If .Cells(r, 1).Value = kname Then .Cells(r, 1).Select Exit Do End If r = r + 1 Loop End With End Sub '//-------------- ドット描写用プロシジャー Sub MakeBelt(Sh As Worksheet, Nm As String, _ Bx As Double, By As Double, Hi As Double, Wi As Double, Cr As Long) Dim shp As Shape Dim SPos As Double On Error Resume Next Set shp = Sh.Shapes(Nm) shp.Delete On Error GoTo 0 SPos = By - Hi Set shp = Sh.Shapes.AddShape(msoShapeRectangle, Bx, SPos, Wi, Hi) shp.Name = Nm shp.Fill.ForeColor.RGB = Cr shp.Line.Visible = False '外枠の有無 shp.OnAction = "ExShapeClick" End Sub
- imogasi
- ベストアンサー率27% (4737/17069)
データラベルを表示し、そのデータラベルの「内容」の項目を、セルの値や系列名、などににすれば、内容がわかるのに、シートのセルを指し示して、どうするのか。 そのグラフの系列の点をクリックすると、元データシートの系列も指し示してくれるようだが、それでは不十分なのか? 質問が実現したとして、あと、何がやりたいのか? 仕組み的に、簡単に実現すれば、それもやれば良いが、イベントの補足ー>該当箇所の情報の独自表示、は、普通レベルでは、むつかしいのでは?
お礼
ご意見ありがとうございます。ユーザアプリケーションには十人十色、色々存在し、「シートのセルを指し示」すことで付加価値を出すこともあります。 色々と調べてみたところ、散布図グラフをワークシートに作成するのではなく、グラフシートに作成することで、Chart_MouseDownイベントを認識することもでき、ハンドラ内でTypeName(Selection)が"Point"であることを知れるところまで進みました。あとは認識できたPointオブジェクトが、元データのどれに対応するのかを紐づけることができれば勝利です。
補足
「参考になりそうなコード」、ありがとうございます。詳細に確認してみたいと思います。 ところで、このお礼を兼ねて現状報告まで。 グラフシートに散布図を描くことで Chart_MouseDown()イベントを発生させられることまでは前記したとおり。以前は、このイベントハンドラ内で、Selectionの属性を取得することでクリックされたマーカーを捕まえようとしていたのですが、マーカーをクリックしたつもりでもチャートエリア全体がSelectされたり、そのマーカーが属する系列全体が選択されたりと、操作性の良いGUIは作れませんでした。 そこでChart_MouseDown()で受け渡されるクリックされたXY座標値を使用して ActiveChart.GetChartElement x, y, ElemID, Arg1, Arg2 を実行することで、指定した座標のチャート要素の属性値を取得することで、どの系列の何番目の要素なのかを知ることができました。 Excelって、色々考えられて設計されてますね。改めて凄いと認識させられました。