- ベストアンサー
グラフを挿入した時実行はどう書く エクセル
昨日質問したとき、間違ったカテゴリーに書き込みしてしまいました。 削除して再度質問します。 エクセルのグラフに図形(直線や丸)を新規挿入したときに、図形の位置を シートに書き込みたいと思っています。 グラフに図が新規挿入されたときに実行するというvbaのコードは、どのように 書くのでしょうか? よろしくアドバイスお願いいたします。 windows7 excel2010です。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
>前回グラフの縦軸を変更したとき、直線を崩さない方法を質問しました。 下記の仕切り直しですね。 http://okwave.jp/qa/q7397859.html 上記で ”手作業で縦軸の範囲を変更しています” という事ですので Excelに最大値と最小値入力するようにすればどうでしょうか。 シートのChangeイベントを利用して一連の作業が可能になると思います。 ≪参考≫ ワークシートのイベントプロシージャ http://excelvba.pc-users.net/fol3/3_6.html 取りあえず既存の直線のY座標変更の例です。 前提条件として直線には一意の名前を付けておきます。 例えば、値が380の線なら380tlineのように値の数字を前におくようにします。 A1に最大値、A2に最小値を入力します。 ★1の処で最後の数値は計算誤差の補正値を入れています。 使えるようならシートイベントプロシージャに移植してください。 (例1) Dim maxs As Double, mins As Double Dim pih As Double, pit As Double Dim tltop As Double Dim tl As Object With ActiveChart With .Axes(xlValue) .MaximumScale = Range("A1").Value .MinimumScale = Range("A2").Value maxs = .MaximumScale mins = .MinimumScale End With pih = .PlotArea.InsideHeight pit = .PlotArea.InsideTop For Each tl In .Lines tl.Top = pit + pih * (maxs - Val(tl.Name)) / (maxs - mins) - 0.5 '★1 Next End With
その他の回答 (5)
- xls88
- ベストアンサー率56% (669/1189)
>No.4 この回答への補足 >>tl.Top = pit + pih * (maxs - Val(tl.Name)) / (maxs - mins) - 0.5 >これは何をしているのでしょうか? グラフエリアの左上隅を基点として、そこからの距離で各部品の座標値が設定されます。 上記の式を言葉に置き換えると 図形のY座標 = プロットエリアのY座標 + プロットエリアの高さ * (Y軸最大値 - 図形の表示位置)) / (Y軸最大値 - Y軸最小値) - ズレ補正値 大きく纏めると グラフエリア内の図形のY座標 = グラフエリア内のプロットエリアのY座標 + プロットエリア内の図形のY座標 ということです。 あらかじめ図形には、Y軸上の表示位置を示す名前にして置きます。 例:380tline Val関数を使えば数値を簡単に取り出す事ができます。 Val(tl.Name) で380という値が取得されます。 図形のプロットエリア内での表示位置がY軸ラベル値で得られたわけです。 次にプロットエリア基点からの座標値に変換操作をします。 プロットエリアの高さ * (Y軸最大値 - 図形の表示位置)) / (Y軸最大値 - Y軸最小値) でY軸上の比率を掛けて座標値に変換しています。 こんな事で理解して頂けるでしょうか?
お礼
回答ありがとうございます。 >グラフエリアの左上隅を基点として、そこからの距離で各部品の座標値>が設定されます。 >上記の式を言葉に置き換えると >図形のY座標 = プロットエリアのY座標 + プロットエリアの高さ * (Y軸最>大値 - 図形の表示位置)) / (Y軸最大値 - Y軸最小値) - ズレ補正値 >でY軸上の比率を掛けて座標値に変換しています。 やっとわかりました。 昔数学(算数か?)で習った比例式というやつですね。 しかも、長さが左上隅からになっているから、 Y軸最大値 から 図形の表示位置を引くわけですか。 数学はさっぱりだったので、思いつきもしませんでした。 数学得意な人とかはこんなコードを思いつくんでしょうね。 すごいです。勉強になります。 教えていただいたことを元に、コードを書きたかったですが、 いつになるかわからないので、これで終了させていただきます。 それから、イベントですが軸が変更になったときなので、mousedown ではだめですよね。ボタンでもつくります。 何度も本当にありがとうございました。
- xls88
- ベストアンサー率56% (669/1189)
念のためですが、No.4 の補正値は適当です。 試行錯誤して決めてください。 図形の直線ではなく、ダミー系列で近似曲線を表示する例を挙げます。 グラフの系列ですから軸の最大値最小値の変更に必然的に追随します。 A1:A2に系列の値が入力されていると仮定 Sub test() Dim c As Range Dim dd As Variant Dim np As Long Dim ns As Long Dim i As Long With ActiveChart ns = .SeriesCollection.Count np = .SeriesCollection(1).Points.Count For Each c In Range("A1:A2") i = i + 1 dd = dummydata(c.Value, np) With .SeriesCollection.NewSeries .ChartType = xlLine .Border.ColorIndex = xlNone .Values = "{" & dd & "}" End With .HasAxis(xlValue, 2) = False With .SeriesCollection(ns + i).Trendlines.Add .Type = xlLinear .Forward = 0.5 .Backward = 0.5 .Border.ColorIndex = 3 End With If .HasLegend = True Then .Legend.LegendEntries(ns + 1).Delete .Legend.LegendEntries(ns + 1).Delete End If Next End With End Sub Private Function dummydata(tlval, np) Dim i As Long For i = 1 To np dummydata = dummydata & "," & tlval Next i dummydata = Replace(dummydata, ",", "", 1, 1) End Function 図形の丸はどういった処に使っているのですか? 直線でもそうですが、VBA化も可能だと思います。 しかし、出来るだけグラフの標準機能を流用した方が良いように思います。
お礼
近似曲線を手作業で引いたとき、線がどこまでも伸びてしまいました。 株価のグラフに、トレンドラインとして引くので、トレンドが変わったところで (上昇から下降に変わった、あるいはその逆)線が止まって欲しいのです。 なので、他の方法を考えていた訳です。 ただし、上記回答いただいたコードは調べておりません。 私の力不足で時間がかかってしまうので今後時間をかけて調べようと 思います。 ありがとうございました。
- mitarashi
- ベストアンサー率59% (574/965)
#2です。 >.Offset(0, 4).Value = shp.Left + shp.Width * shp.Adjustments.Item(1) Adjustments.Item(1)は吹き出しの様なオートシェイプの持つプロパティですので、 直線や丸といった単純なオートシェイプでは関係無いと思います。 すっかり忘れておりますが、当時自動記録で試行錯誤したり、ネット検索して、吹き出しの先端を求める方法を見いだしているのだと思います。検索してみると、OKwave内に参考になる記事がありました。 http://okwave.jp/qa/q6021395.html >convertToValueは関数でしょうか?何をさせるものなのですか? >convertToPlotarePoとは何でしょうか? いずれも自作というか、他の方の作成したものを少しアレンジしたプロシージャですね。 プロットエリアの座標←→グラフの軸目盛りの数値の相互変換(一種の座標変換)をしています。 http://okwave.jp/qa/q5021130.html の#3のコードの下の方に記述されています。 以上、ご参考まで。
お礼
返事が遅くなりすいません。 >>convertToValueは関数でしょうか?何をさせるものなのですか? >>convertToPlotarePoとは何でしょうか? >いずれも自作というか、他の方の作成したものを少しアレンジしたプロシージ>ャですね。 functionプロシージャの、基本的な記述も知らず、アホな質問をしてしまいました。反省です。 イベントについてですが、よく考えたらグラフの上でクリックして図の位置 を決めるので、MouseDownでよかったですね。 試しにmousedownイベントに dim i For Each i In ActiveChart.Shapes With i If .Type = msoLine Then Range("a1") = .Left End If End With Next i と記述したところ動きました。 お騒がせでした。 さてmitarasi様のコードを調べ中なのですが、あと1つだけ教えていただけ ないでしょうか。 convertToPlotarePos = (SetScale - MinScale) / (MaxScale - MinScale) * PIW + PIL '軸目盛りの値→グラフ上の座標に変換するプロシージャとのことですが、 意味がわからずに頭かかえています。 時間があいた時にでもお願いいたします。
補足
たびたびの回答ありがとうございます。 内容について調べます。 時間をください。
- mitarashi
- ベストアンサー率59% (574/965)
図挿入のイベントは無いと思いますが、下記にご参考になる部分があるかもしれません。 エクセルのグラフに記入した注釈の吹き出しが、軸目盛りを変更しても追従する様なコードを回答した事があります。軸目盛り変更をマクロで行うことで、目盛り変更前の図形の位置をワークシートに保存し、変更後に読み出して調整するというものです。 http://okwave.jp/qa/q5021130.html
お礼
お礼が遅くなりすいません。 質問していた内容についてはわかりました。 何度も回答いただきましてありがとうございました。 勉強になりました。 追伸 イベントは私の勘違いで、軸の変更なのでMouseDownでは うごかないのでボタンでも作ろうと思います。
補足
mitarashi様回答ありがとうございます。 こちらの回答については以前検索して知っておりました。 ただ私の力不足で内容についてわからない所があり、まねたりすること ができませんでした。 いくつか質問させてください。 >.Offset(0, 4).Value = shp.Left + shp.Width * shp.Adjustments.Item(1) これは図の右端の位置を求めているのですか? Adjustments.Itemは調べたところ図の調整値だったと思いますが、 なぜshp.Width と shp.Adjustments.Item(1)を掛けるのですか? >.Offset(0, 5).Value = convertToValue(objGraph, .Offset(0, 4).Value) ヘルプやネット検索で見つけられなかったのですがconvertToValueは 関数でしょうか?何をさせるものなのですか? 同じく >x = convertToPlotarePos(objGraph, .Cells(i, 6).Value) convertToPlotarePoとは何でしょうか? お手数ですがお教えください。
- xls88
- ベストアンサー率56% (669/1189)
>エクセルのグラフに図形(直線や丸)を新規挿入したときに、図形の位置を >シートに書き込みたいと思っています。 何故ですか? 図形の位置を知って何をしたいのですか? >グラフに図が新規挿入されたときに実行するというvbaのコード グラフシートならイベントプロシージャが用されています。 しかしExcel2007ですが「図の挿入」が出来ませんでした。 埋め込みグラフなら「図の挿入」が出来ますがイベントがありません。 自前のイベントを用意すれば何とかなるのかも知れませんが難しいです。 図形の位置を知って何をしたいかによって別の案がかんがえられるかも知れません。 取りあえず図形の位置を取得するコードを挙げてみます。 グラフを選択しておいて実行してください。 (例1) Dim shp As Shape For Each shp In ActiveChart.Shapes MsgBox shp.Name & vbLf & shp.Left & " × " & shp.Top Next
補足
xls88様 いつも回答ありがとうございます。 前回グラフの縦軸を変更したとき、直線を崩さない方法を質問しました。 その時、あきらめた株価のグラフにトレンドラインを図形の直線で追加したとき図形の位置をシートに書き込む。その縦軸の数値が変更になったとき ローソク足の位置と比較して移動させる方法を再度検討中で質問させていただきました。 前回教えていただいた、近似曲線で引く方法や任意の日にちと日にちの 間を数字で埋めて折れ線グラフで引く方法などできるようになったのですが、直線の数が多いので図形の直線で引く方法を検討中です。 >埋め込みグラフなら「図の挿入」が出来ますがイベントがありません。 やはりないのですね。
補足
返事するのが遅くなりすいません。 イベントの件ですが、図形はグラフの中でのみ使用するので、グラフの mousedownを使えばいいのに気づきました。お騒がせでした。 1点質問していいでしょうか? >tl.Top = pit + pih * (maxs - Val(tl.Name)) / (maxs - mins) - 0.5 これは何をしているのでしょうか? 掛けたり引いたり割ったりしてあるのが、何を意図して作ってあるのかが 全くわかりません。 頭を抱えています。 お時間のある時に教えていただけないでしょうか?