グラフのプロットエリアと描画領域のズレを求めるには?

Question 76.6 Excel VBA Borad (掲示板)より Previous Next
折れ線グラフの各点上に、オートシェイプの ☆ を置きたいのですが、各点 (SeriesCollection(n).Points(m)) の位置情報 (グラフ上での Left, Top) を取得する方法がわからないのです。
元データから、グラフ上での位置の算出は可能なのですが、「プロットエリア」 と、「実際にグラフが描画されている領域 (書式設定の 「輪郭」 で描画される枠)」 とがズレているため、単純にプロットする事ができないのです。

この上下左右のズレ量 (マージンというか…) が分かれば解決するのですが、これを取得する方法は無いものかと。
軸のフォントサイズや書式を変えたりするだけで、この部分は変更されてしまうため、定数として置いておくわけにもいかず…。
何か良い方法がありましたらご教授いただけないでしょうか。 可能か不可能か、だけでも結構ですので…。
よろしくお願い致します。
Answer   2005.11.20 永井善王
レスが付かないようなので。
高度なテクニックを探求なさっているのですね。答えられる人は、かなり限られるのではないでしょうか。
このような場合はギブアンドテイクの精神で、あなたがお持ちの技術(作成したコード等)を提供なさると、道が開けるかも知れませんね。
例えば、どうすれば、「元データから、グラフ上での位置の算出は可能」なのでしょうか。 それをきっかけにして、共に考えていただける人が現れるかも知れません。
えらそうなことを言ってしまいましたが私はグラフ関係は、それ程くわしくないので、下記コードは何の手掛かりにもならないかと 思いますが。
    pl = ActiveChart.PlotArea.Left
    pt = ActiveChart.PlotArea.Top
    pw = ActiveChart.PlotArea.Width
    ph = ActiveChart.PlotArea.Height
    
    pil = ActiveChart.PlotArea.InsideLeft
    pit = ActiveChart.PlotArea.InsideTop
    piw = ActiveChart.PlotArea.InsideWidth
    pih = ActiveChart.PlotArea.InsideHeight
ありがとうございます
「ギブアンドテイクの精神・・・」
確かにおっしゃる通りです。情報が少なすぎました。 OS、Excel のバージョンすら書いてませんでした… (Win2000、Excel2000)。
「元データから、グラフ上での位置の算出」
グラフの横軸に対応する項目番号と、数値情報から、 グラフ本来の原点 (左下座標) さえわかれば、位置情報として算出できます。

「・・・下記コードは何の手掛かりにもならないかと思いますが。」
とんでもない! まさにコレ (pil、pit、piw、pih) です!
.PlotArea の中にあったんですね…って、考えてみれば当たり前ですね…。ヘルプの読み込みが足りませんでした…。
軸の向きを反転したりしないデフォルト状態であれば、
Function leftTop(p As Integer, q As Double) As xyPos
    With ActiveChart
        leftTop.xPos = .PlotArea.InsideLeft + (p + 0.5) / _
                        (wnum + 1) * .PlotArea.InsideWidth
        leftTop.ypos = .PlotArea.InsideTop + .PlotArea.InsideHeight - (q - _
                minRange) / (maxRange - minRange) * .PlotArea.InsideHeight
    End With
End Function
p : 横軸の項目番号、 q : その時の値、 wnum : 項目数、 maxRange : 縦軸の最大値、 minRange : 縦軸の最小値、
返り値の xyPos は Type 定義したものです。
で、X-Y 情報を取得し、最後に、配置するシェイプの Width/2 だけ左に、Hight/2 だけ上に移動して配置したところ、意図する結果を得られました。
かなりの間、深みにハマっていたので本当に助かりました。 ありがとうございました!

 

Excel VBA Macro