|
▼わいわい さん:
こんばんは。
>確認したところ、75%表示のときに1ドット=1また150%表示のときに1ドット=0.5ですから、グラフ軸左上とPlotAreaの左上は 16/3*ActiveWindow.Zoom/100 ドット(当然四捨五入)ずれていると言うことみたいですね。
なるほど・・・、実は私は当初Zoomの事まで考慮してなかったので
すごい!!と感心していたのですが・・・。
ちょっと実験してみましょう!!
新規ブックの適当なシートのシートモジュールに
'======================================================================
Dim WithEvents cht As Chart
'======================================================================
Sub set_obj()
Set cht = Me.ChartObjects(1).Chart
MsgBox cht.Name
End Sub
'======================================================================
Sub reset_obj()
Set cht = Nothing
End Sub
'=========================================================================
Private Sub cht_MouseDown(ByVal Button As Long, ByVal Shift As Long, ByVal x As Long, ByVal y As Long)
Dim dx As Double
Dim dy As Double
Dim hx As Double
Dim hy As Double
Dim txt As TextBox
Dim shp As Shape
Dim xmax As Double
Dim ymax As Double
With cht.PlotArea
lp = .InsideLeft: Tp = .InsideTop
Wp = .InsideWidth: Hp = .InsideHeight
End With
ymax = cht.Axes(xlValue).MaximumScale
xmax = cht.Axes(xlCategory).MaximumScale
dx = xmax / Wp
dy = ymax / Hp
hx = cht.ChartArea.Left
hy = cht.ChartArea.Top
MsgBox "Plotx" & (0.75 * x * 100 / ActiveWindow.Zoom - hx - lp) * dx & "----" & "plotY" & (Tp + Hp - 0.75 * y * 100 / ActiveWindow.Zoom + hy) * dy & vbCrLf & _
"plotarea inleft" & cht.PlotArea.InsideLeft & "----" & "plotarea intop" & cht.PlotArea.InsideTop & vbCrLf & _
"plotarea left" & cht.PlotArea.Left & "----plotarea top " & cht.PlotArea.Top & vbCrLf & _
"0.75*x= " & 0.75 * x & "---- 0.75*y= " & 0.75 * y & vbCrLf & _
"chartarea.left " & ActiveChart.ChartArea.Left & "--- chartarea top " & ActiveChart.ChartArea.Top
End Sub
'=======================================================================
Sub mk_sample()
Dim mkcht As Chart
With Me
.Range("a1:b1").Value = Array("X", "Y")
With .Range("a2:b31")
.Formula = "=round(100*rand(),2)"
.Value = .Value
End With
End With
Set mkcht = ThisWorkbook.Charts.add
With mkcht
.ChartType = xlXYScatter
.SetSourceData Source:=Me.Range("A1:B31"), PlotBy:=xlColumns
.PlotArea.Left = 0
.PlotArea.Top = 0
.Location Where:=xlLocationAsObject, Name:=Me.Name
End With
End Sub
前回のSelectイベントのコードをMouseDownイベント用に変更したものです。
zoomは、100%で実行してください。
1.mk_sampleを実行してサンプルデータとグラフを作成してください。
2.作成したグラフのPlotareaのLeftとTopプロパティは0に設定しました。
グラフを良く見てください。
この「0」って、グラフエリアからのポイントですよね?
3.set_objを実行してイベントの発生を可能にしてください。
4.まず、このチャートオブジェクトの左上の角をクリックしてください。
(0.75*X 及び、0.75*yが0になるポイントです)。
結構合わせるのが難しいですけど・・・、
両方0になるポイントをクリックしてください。
このとき、Msgboxが表示されますが、
抜粋すると、
Plotarea.Left Plotarea.Topは、0
ChartArea.Left Chartarea.Topは、共に3と表示されました
(私の環境で)
つまり、PolotareaのLeft,Topは、Chartareaを起点にしたポイントであるのに
対し、イベントから取得される0.75*xと0.75*yは、
ChartObjectの左上を角を起点にしています。
このポイント3の補正のための処理が必要だと思っているのです。
よって、Mousedownイベントの補正が上記のコードのようになるのですが・・。
プロットもクリックしてください。X,Yの値もおおよそ合っています。
いかがでしょうか?
|
|