
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
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)には入らないようでした。
バグなのか、それとも何か私が勘違いをしているのか分かりませんが、ともかくそのような現象がみられたので、報告します。
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
ありがとうございます。
ご説明の通りやったら、出来ました。
チェックボックスを配置してチェックがついたときにSetChartが実行されるようにしたのですが、
チェックが外されたときにSetChartを無効にすることはできるのでしょうか?
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.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
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
Excel グラフのプロットからデータを見つける
Excel(エクセル)
-
Excelの散布図でプロットした任意の2点を直線で結びたいのですが
Excel(エクセル)
-
VBA 散布図の点の元セルを取得したい
Excel(エクセル)
-
-
4
エクセルのグラフで値を求める方法
Excel(エクセル)
-
5
グラフ要素のセルを参照したいのですが・・・
Visual Basic(VBA)
-
6
Excel VBAでグラフをクリックした時走るイベントありますか?
その他(プログラミング・Web制作)
-
7
Excelでx軸とy軸を設定して図を作成したい。
Excel(エクセル)
-
8
エクセルで散布図をつくったとき
その他(Microsoft Office)
-
9
VBA(excel)でグラフのデータ範囲の取得
その他(Microsoft Office)
-
10
ブック名、シート名を他のモジュールからも参照可能にする方法
Access(アクセス)
-
11
グラフの交点の求め方(Excel)
Visual Basic(VBA)
-
12
cellsで特定の離れた範囲を選択する方法は?
Visual Basic(VBA)
-
13
ExcelVBA:複数の特定のグラフを選択する方法
Visual Basic(VBA)
-
14
エクセルのグラフ読み取りについて
その他(Microsoft Office)
-
15
グラフのサイズを揃えたいのでVBAを使っていたのですが、数値軸の最大値
その他(Microsoft Office)
-
16
エクセルグラフで系列名を取得したい
Excel(エクセル)
-
17
エクセルの散布図グラフで二点を直線でつなぎたい。
Excel(エクセル)
-
18
VBA シートをコピーする際に Copyメソッドは失敗しましたのエラーが出てしまいます
Visual Basic(VBA)
-
19
実行時エラー 438になった時の対処法を教えて下さい。
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excel VBAで、ユーザーフォーム...
-
エクセルVBA クラスモジュール...
-
印刷後メッセージボックスを表...
-
Visual Basicプログラムのエラ...
-
エクセルVBAでシートモジュール...
-
モジュールの最大数はいくつな...
-
VBでグローバル変数を宣言するには
-
ユーザー定義関数に#NAME?が返...
-
acwzlibとは?
-
【vba】フォームに書いてあ...
-
ユーザーフォーム上に表示され...
-
Perlでモジュールをインストー...
-
Tomcat マイナーバージョン移行...
-
Excel VBAでリンク切れをチェッ...
-
クラスモジュールを使わないと...
-
Excel VBA 定義されたプロージ...
-
ExcelVBA:パブリック オブジェ...
-
VBのフォームモジュールと標準...
-
VBA This Workbookモジュール...
-
Form間の値の渡し方
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel VBAでリンク切れをチェッ...
-
エクセルVBAでシートモジュール...
-
VBでグローバル変数を宣言するには
-
ユーザー定義関数に#NAME?が返...
-
Excel VBAで、ユーザーフォーム...
-
Excel VBA 定義されたプロージ...
-
vba userFormのSubを標準モジュ...
-
標準モジュールを削除したい。(...
-
'Range'メソッドは失敗しました
-
VBAで別モジュールへの変数の受...
-
モジュールからフォームのボタ...
-
モジュールの最大数はいくつな...
-
グラフのX,Y座標を取得したい
-
モジュールとクラスの違いって...
-
【vba】フォームに書いてあ...
-
Form間の値の渡し方
-
VBのフォームモジュールと標準...
-
VBA モジュールで共通に使う変...
-
Excel VBA 『Call』で呼び出す...
-
acwzlibとは?
おすすめ情報