• ベストアンサー

グラフのX,Y座標を取得したい

グラフにカーソルを合わせるとX,Y座標が表示されますが、 その状態でクリックを押して、X,Y座標を取得することはできますか? VBAを使っても大丈夫です。

質問者が選んだベストアンサー

  • ベストアンサー
  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.8

#3です。当方に対するコメントではありませんが、CheckBox(コントロールツールボックス)による動作On/Offなら、Worksheet_Activateのイベントなどに比べてスッキリしますので、完成形?として上げておきます。(目的のグラフのあるWorksheetモジュールに記載します) クラスモジュールを使ってみようかと思うスキルの方ならご自分で出来る事だと存じますが、ご参考まで。 Public WithEvents myGraph As Chart Private Sub CheckBox1_Click() If Me.CheckBox1.Value = True Then Set myGraph = Me.ChartObjects(1).Chart Else Set myGraph = Nothing End If End Sub Private Sub myGraph_MouseUp(ByVal Button As Long, ByVal Shift As Long, ByVal x As Long, ByVal y As Long) Dim ElemID As Long, Arg1 As Long, Arg2 As Long Dim Var As Variant Dim Msg As String If Me.CheckBox1.Value = False Then Exit Sub 'GetChartElementメソッドを用いてクリックしたデータ系列を取得。 '(中略)下記URL参照 'http://moug.net/tech/exvba/0020010.html'第三引数以降に対象オブジェクトの情報が格納される End Sub

その他の回答 (7)

回答No.7

>チェックが外されたときにSetChartを無効にすることはできるのでしょうか? ワークシート上のチェックボックスでしょうか? でしたら、No.4 の標準モジュールのほうのコードを次のものに書き換えてみてください。 Private cl As New Class1 Public Sub SetChart()   If ActiveSheet.CheckBoxes(1) = xlOn Then     Set cl.myChart = Worksheets(1).ChartObjects(1).Chart '←実際のインデックスに書換え   Else     Set cl.myChart = Nothing   End If End Sub

回答No.6

No.4 です。No.4 のコードにおけるイベントとメソッドの挙動について、情報提供します。 私が手元の Excel 2007 で試してみたところ、MouseDown イベント(クリックのボタンを押したときに発生)では正常に動くのですが、なぜか MouseUp(クリックのボタンが上がったときに発生)にすると、エラーが発生しました。MouseUp のときは、Chart.GetChartElement メソッドにおいて、第 3 引数(ElementID)には値が入るのですが、第 4、第 5 引数(SeriesIndex、PointIndex)には入らないようでした。 バグなのか、それとも何か私が勘違いをしているのか分かりませんが、ともかくそのような現象がみられたので、報告します。

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.5

#3です。考えてみると、Worksheet自体がクラスモジュールなので、別個にクラスモジュールを設けなくてもいけました。 目的の埋め込みグラフがあるワークシートモジュールに記述して下さい。ご参考まで。 Public WithEvents myGraph As Chart Private Sub myGraph_MouseUp(ByVal Button As Long, ByVal Shift As Long, ByVal x As Long, ByVal y As Long) Dim ElemID As Long, Arg1 As Long, Arg2 As Long Dim Var As Variant Dim Msg As String 'GetChartElementメソッドを用いてクリックしたデータ系列を取得。 '(中略)下記URL参照 'http://moug.net/tech/exvba/0020010.html End Sub Private Sub Worksheet_Activate() If myGraph Is Nothing Then Set myGraph = Me.ChartObjects(1).Chart End Sub

回答No.4

ああ、すみません。No.1・2 ですが、ご質問の意味を誤解していたのかもしれません。 座標が表示されるというのは、散布図のプロットのことですか? そうだとすれば、No.1・2 のコードは、グラフ以外のものも含めてどんな図であっても、という話なので、無視してください。 メニューからクラスモジュールを挿入。クラスモジュールと標準モジュールに次の 2 つのコードを貼ってください。次に、SetChart を 1 回、実行。後はプロットをクリックしてください。イミディエイトウィンドウに座標を書き出します。 クラスモジュール Public WithEvents myChart As Chart Private Sub myChart_MouseDown(ByVal Button As Long, ByVal Shift As Long, ByVal x As Long, ByVal y As Long)   Dim ElementID As Long, SeriesIndex As Long, PointIndex As Long   Dim ax As Variant, ay As Variant   myChart.GetChartElement x, y, ElementID, SeriesIndex, PointIndex   If ElementID = xlSeries Then     ax = myChart.SeriesCollection(SeriesIndex).XValues     ay = myChart.SeriesCollection(SeriesIndex).Values     Debug.Print "x:" & ax(PointIndex) & vbCrLf & "y:" & ay(PointIndex) & vbCrLf   End If End Sub 標準モジュール Private cl As New Class1 Public Sub SetChart()   Set cl.myChart = Worksheets(1).ChartObjects(1).Chart  '←実際のインデックスに書換え End Sub

miya2004
質問者

お礼

ありがとうございます。 ご説明の通りやったら、出来ました。 チェックボックスを配置してチェックがついたときにSetChartが実行されるようにしたのですが、 チェックが外されたときにSetChartを無効にすることはできるのでしょうか?

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.3

グラフのマーカーをクリックして、該当するX,Yの値を得たいのですね。 1.グラフシートなら、こちらで可能です。 http://moug.net/tech/exvba/0020010.html 2.ワークシートの埋め込みグラフの場合は、こちらと組み合わせる必要があります。 http://bitassociates.jp/vba/tips/tips004.html 試しにやってみました。 Worksheet_Activateイベントでクラスのインスタンスを生成しているので、一旦他のシートに移ってから戻らないと動作しません。また、最小限しか記述してないので、お行儀が悪いコードですが、ご参考まで。 '☆ クラスモジュール class1(挿入、クラスモジュールでのお仕着せの名前のまま) Public WithEvents myGraph As Chart Private Sub myGraph_MouseUp(ByVal Button As Long, ByVal Shift As Long, ByVal x As Long, ByVal y As Long) Dim ElemID As Long, Arg1 As Long, Arg2 As Long Dim Var As Variant Dim Msg As String 'GetChartElementメソッドを用いてクリックしたデータ系列を取得。 (中略) 最初のリンク先をご参照下さい。 End Sub '☆グラフを埋め込んであるシートモジュール(グラフが一個しかない前提)に記述 Dim myGraphObj As New Class1 Private Sub Worksheet_Activate() Set myGraphObj.myGraph = Me.ChartObjects(1).Chart End Sub

回答No.2

No.1 です。連続ですみません。 No.1 のコードで、変数 z は Long 型よりも、Double のほうが誤差が少ないでしょうね。それでお願いします。

回答No.1

作ってみました。クリックの位置となるとそのようなオプジェクトやプロパティは Excel になく、スクリーン座標が必要ですから、API 関数です。図の左上の角に対する相対的な位置座標の計算は、算数で習うとおり、位置ベクトルの引き算でできるわけですね。 標準モジュールに下のコードを貼り付け。グラフを右クリック、マクロの登録から登録。クリックしたときに A2・B2、A3・B3、A4・B4、…に x、y 座標を記入していきます。 参考 URL の、特に注 1 というところも参照してください。DPI、PPI の話が載っています。 Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long Type POINTAPI   x As Long   y As Long End Type Sub PointInClick()   Const DtoP As Double = 72 / 96   Dim z As Long, xw As Long, yw As Long, xs As Long, ys As Long, xc As Long, yc As Long   Dim p As POINTAPI   z = ActiveWindow.Zoom / 100   xw = ActiveWindow.PointsToScreenPixelsX(0)   yw = ActiveWindow.PointsToScreenPixelsY(0)   With ActiveSheet.Shapes(1)     xs = .Left     ys = .Top   End With   GetCursorPos p   With Cells(Rows.Count, "a").End(xlUp)     .Offset(1, 0).Value = Round(((p.x - xw) * DtoP) / z - xs)     .Offset(1, 1).Value = Round(((p.y - yw) * DtoP) / z - ys)   End With End Sub

参考URL:
http://home.att.ne.jp/zeta/gen/excel/c04p06.htm
miya2004
質問者

お礼

ありがとうございます。 座標がポップアップされるから簡単に取得できると思ってましたが、 かなりむずかしそうです

関連するQ&A

  • 座標(x,y)から座標(x2,y2)を頂点としてとおり座標(x3,y3)と交わる放物線?

    現在プログラムを作成しているのですが、とあるグラフを表示して 欲しいと言われ困っています。 ニーズは 任意の座標(x,y)と座標(x3,y3)を放物線で記すこと。 ただし、この放物線はxからx3の間隔の8:2の場所に頂点(x2,y2)が あること。 です。 すなわち・・・ (x,y)が(0,50)で(x3,y3)が(100,25)なら 頂点(x2,y2)は(80,?)に あるグラフです。 そもそも、こんなグラフを式でかけるんでしょうか? かけるとしたらどんな式で書けばいいのか教えてください。 条件としては 必ず x<=x3 , y>=y3 , xとx3の間隔は最低100です。 いろいろ参考書とか見てみたのですが、ギブアップです。 お助けください。

  • y=x*(1-x)^(2/3)のグラフ

    関数y=x*(1-x)^(2/3)のグラフの概形を描きなさいという問題があって、問題集の解答を見たところ、xの座標が1より上のところにはグラフは存在していませんでした。つまり、このグラフはx≦1の範囲でしか描くことができないということです。 しかし、疑問に思ったのですが、たとえばx=28のとき y=28*{-27^(2/3)}=28*(-3)^2=28*9=252 とはならないのでしょうか?

  • 二次関数 y=x2 のグラフ上に、それぞれx座標が-2、4である2点A

    二次関数 y=x2 のグラフ上に、それぞれx座標が-2、4である2点A,Bがあります。また、点Pは、関数 y=x2 のグラフ上の原点Oと点Bの間にあります。 次の問に答えなさい。   (1)直線ABの式を求めなさい。 (2)点Pのx座標が1のとき、△APBの面積を求めなさい。 (3)△APBの面積が△AOBの面積の5/8倍になるとき、点Pのx座標を求めなさい。 (1)はy=2x+8 で分かりました。(2)、(3)の求め方をお願いします。

  • y=2/3・x^2とx^2+y^2=1の共有点の座標

    x^2+y^2≦1 と y≦(2/3)x^2 の連立方程式の表す領域を図示する問題で、 x^2+y^2=1のグラフを描いた後、y=(2/3)x^2のグラフを描くのに共有点の座標を求めるのですが、 その参考書には 「y=x^2 と x^2+y^2=1 の連立方程式を解いて、(√3/2 , 1/2),(-√3/2 , 1/2)」とあります。そこでこれについて2つ質問があります。 (1) まず、y=x^2ではなくy=(2/3)x^2ではないのですか。 (2) y=(2/3)x^2があっているとして、それで計算してもx=(-9±√97)/8、 y=x^2が正しいとしても、x=(-1±√5)/2になってしまいます。

  • X-Y座標の線形化

    X-Y座標で曲線を描く関数において変数を別の形の変数に置き換えれば1次関数のような線形グラフとなるか、特に次の3つの場合について教えて下さい。 Y=X+X^3 1/Y+1/X=3 X=3/(Y+4)

  • x座標、y座標がともに正の整数となる点

    方程式2x+3y=50のグラフ上にあり、x座標、y座標がともに正の整数となる点は何個あるか求めなさい という問題のわかりやすい解き方を教えてください。 地道に数えていく以外の方法があれば知りたいです。よろしくお願いいたします。

  • x-y座標に10個ぐらいの点をプロットしたい。

    エクセルのシートに x y 1 9.76 4.81 2 7.24 3.47 3 6.99 1.94 4 6.19 3.04 5 6.35 1.82 6 8.54 4.18 7 6.53 4.18 8 7.35 2.44 9 7.75 3.80 というデータがあるのですが、 これをx-y座標にグラフ化したいのですが、どうしたらいいのかわかりません。エクセルでもできますか? できなければ何かフリーソフトでもありますか? 急いでますのでよろしくお願いします。

  • グラフ上の座標から0.01離れた座標の求め方

    いつもお世話になります。宜しくお願いします。 下記座標を通る曲線(にみえる)グラフがあります。 教えて頂きたいのは、この線に対して距離0.01離れた座標を求めたいのです。 単純にyのみを+0.01するのではありませんし、二等辺三角形の傾斜部を0.01として求めた値でもありません。 求め方は、座標(1)と(2)の直線に対し、座標(1)を通る垂線上の距離が0.01の移動した座標です。 同様に(2)と(3)の直線に対し、(2)を通る垂線上の距離0.01離れた座標を求めたいのです。 この各座標を求める計算式を教えて下さい。 分かり難いところがあれば補足しますので、宜しくお願いします。 座標   x  y (1)0.242 0.238 (2)0.246 0.242 (3)0.256 0.257 (4)0.280 0.288 (5)0.287 0.296

  • y=2^xのグラフ

     y=2^xのグラフを、X方向に3、y方向に2平行移動させたグラフのy=?でしょうか。

  • エクセルのVBAでy=x^2のグラフを書きたい

    エクセルのVBAでy=x^2のグラフを書きたいのですが、どのようにしたらできるのでしょうか? ちなみにVBEのイミディエイトは何をするところでしょうか? debug.print 1とすると1が表示されますが、ここの出力を意図的にクリアする方法はありますか?

専門家に質問してみよう