アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (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
    • good
    • 0

>チェックが外されたときに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
    • good
    • 1

No.4 です。

No.4 のコードにおけるイベントとメソッドの挙動について、情報提供します。

私が手元の Excel 2007 で試してみたところ、MouseDown イベント(クリックのボタンを押したときに発生)では正常に動くのですが、なぜか MouseUp(クリックのボタンが上がったときに発生)にすると、エラーが発生しました。MouseUp のときは、Chart.GetChartElement メソッドにおいて、第 3 引数(ElementID)には値が入るのですが、第 4、第 5 引数(SeriesIndex、PointIndex)には入らないようでした。

バグなのか、それとも何か私が勘違いをしているのか分かりませんが、ともかくそのような現象がみられたので、報告します。
    • good
    • 1

#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
    • good
    • 1

ああ、すみません。

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
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/09/21 18:32

グラフのマーカーをクリックして、該当する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
    • good
    • 0

No.1 です。

連続ですみません。

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

作ってみました。

クリックの位置となるとそのようなオプジェクトやプロパティは 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
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/09/20 18:59

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A