• ベストアンサー

グラフを挿入した時実行はどう書く エクセル

昨日質問したとき、間違ったカテゴリーに書き込みしてしまいました。 削除して再度質問します。 エクセルのグラフに図形(直線や丸)を新規挿入したときに、図形の位置を シートに書き込みたいと思っています。 グラフに図が新規挿入されたときに実行するというvbaのコードは、どのように 書くのでしょうか? よろしくアドバイスお願いいたします。 windows7 excel2010です。

質問者が選んだベストアンサー

  • ベストアンサー
  • xls88
  • ベストアンサー率56% (669/1189)
回答No.4

>前回グラフの縦軸を変更したとき、直線を崩さない方法を質問しました。 下記の仕切り直しですね。 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

pu2343
質問者

補足

返事するのが遅くなりすいません。 イベントの件ですが、図形はグラフの中でのみ使用するので、グラフの mousedownを使えばいいのに気づきました。お騒がせでした。 1点質問していいでしょうか? >tl.Top = pit + pih * (maxs - Val(tl.Name)) / (maxs - mins) - 0.5 これは何をしているのでしょうか? 掛けたり引いたり割ったりしてあるのが、何を意図して作ってあるのかが 全くわかりません。 頭を抱えています。 お時間のある時に教えていただけないでしょうか?

その他の回答 (5)

  • xls88
  • ベストアンサー率56% (669/1189)
回答No.6

>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軸上の比率を掛けて座標値に変換しています。 こんな事で理解して頂けるでしょうか?

pu2343
質問者

お礼

回答ありがとうございます。 >グラフエリアの左上隅を基点として、そこからの距離で各部品の座標値>が設定されます。 >上記の式を言葉に置き換えると >図形のY座標 = プロットエリアのY座標 + プロットエリアの高さ * (Y軸最>大値 - 図形の表示位置)) / (Y軸最大値 - Y軸最小値) - ズレ補正値 >でY軸上の比率を掛けて座標値に変換しています。 やっとわかりました。 昔数学(算数か?)で習った比例式というやつですね。 しかも、長さが左上隅からになっているから、 Y軸最大値 から 図形の表示位置を引くわけですか。 数学はさっぱりだったので、思いつきもしませんでした。 数学得意な人とかはこんなコードを思いつくんでしょうね。 すごいです。勉強になります。 教えていただいたことを元に、コードを書きたかったですが、 いつになるかわからないので、これで終了させていただきます。 それから、イベントですが軸が変更になったときなので、mousedown ではだめですよね。ボタンでもつくります。 何度も本当にありがとうございました。

  • xls88
  • ベストアンサー率56% (669/1189)
回答No.5

念のためですが、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化も可能だと思います。 しかし、出来るだけグラフの標準機能を流用した方が良いように思います。

pu2343
質問者

お礼

近似曲線を手作業で引いたとき、線がどこまでも伸びてしまいました。 株価のグラフに、トレンドラインとして引くので、トレンドが変わったところで (上昇から下降に変わった、あるいはその逆)線が止まって欲しいのです。 なので、他の方法を考えていた訳です。 ただし、上記回答いただいたコードは調べておりません。 私の力不足で時間がかかってしまうので今後時間をかけて調べようと 思います。 ありがとうございました。

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.3

#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のコードの下の方に記述されています。 以上、ご参考まで。

pu2343
質問者

お礼

返事が遅くなりすいません。 >>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 '軸目盛りの値→グラフ上の座標に変換するプロシージャとのことですが、 意味がわからずに頭かかえています。 時間があいた時にでもお願いいたします。

pu2343
質問者

補足

たびたびの回答ありがとうございます。 内容について調べます。 時間をください。

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.2

図挿入のイベントは無いと思いますが、下記にご参考になる部分があるかもしれません。 エクセルのグラフに記入した注釈の吹き出しが、軸目盛りを変更しても追従する様なコードを回答した事があります。軸目盛り変更をマクロで行うことで、目盛り変更前の図形の位置をワークシートに保存し、変更後に読み出して調整するというものです。 http://okwave.jp/qa/q5021130.html

pu2343
質問者

お礼

お礼が遅くなりすいません。 質問していた内容についてはわかりました。 何度も回答いただきましてありがとうございました。 勉強になりました。 追伸 イベントは私の勘違いで、軸の変更なのでMouseDownでは うごかないのでボタンでも作ろうと思います。

pu2343
質問者

補足

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)
回答No.1

>エクセルのグラフに図形(直線や丸)を新規挿入したときに、図形の位置を >シートに書き込みたいと思っています。 何故ですか? 図形の位置を知って何をしたいのですか? >グラフに図が新規挿入されたときに実行するというvbaのコード グラフシートならイベントプロシージャが用されています。 しかしExcel2007ですが「図の挿入」が出来ませんでした。 埋め込みグラフなら「図の挿入」が出来ますがイベントがありません。 自前のイベントを用意すれば何とかなるのかも知れませんが難しいです。 図形の位置を知って何をしたいかによって別の案がかんがえられるかも知れません。 取りあえず図形の位置を取得するコードを挙げてみます。 グラフを選択しておいて実行してください。 (例1) Dim shp As Shape For Each shp In ActiveChart.Shapes MsgBox shp.Name & vbLf & shp.Left & " × " & shp.Top Next

pu2343
質問者

補足

xls88様 いつも回答ありがとうございます。 前回グラフの縦軸を変更したとき、直線を崩さない方法を質問しました。 その時、あきらめた株価のグラフにトレンドラインを図形の直線で追加したとき図形の位置をシートに書き込む。その縦軸の数値が変更になったとき ローソク足の位置と比較して移動させる方法を再度検討中で質問させていただきました。 前回教えていただいた、近似曲線で引く方法や任意の日にちと日にちの 間を数字で埋めて折れ線グラフで引く方法などできるようになったのですが、直線の数が多いので図形の直線で引く方法を検討中です。 >埋め込みグラフなら「図の挿入」が出来ますがイベントがありません。 やはりないのですね。

関連するQ&A

  • エクセルのグラフに図形を挿入

    質問1 エクセル2007で折れ線グラフの横軸を黒色で作成しそのうち一部の軸のみ赤色に変更する方法があれば教えてください。 質問2 現在は横軸黒線の上に赤色で <挿入→図形→直線> を上書きしていますが 画面上では黒線の真上に赤線を乗せたつもりが印刷すると、位置がずれてしまいます。 添付図の A はずれないのに B はずれている。 位置を合わせるために一時的にセル幅を拡大して、試行錯誤してもうまく出来なくて悩んでいます。 ドンピシャに位置合わせの仕方を教えてください。

  • エクセルでグラフ追加について教えてください。

    すみませんが、教えてください。 VBAで、エクセルワークブックのシートの最後にグラフを追加しようとしています。 Charts.Add after:=Sheets(Sheets.Count) このコードだとグラフが、最終シートの後ろではなく、前に追加されてしまいます。 どうすれば、シートの後ろに挿入することができるのでしょうか?

  • Excelのグラフに対するVBAの実行

    Excel2010で、グラフを選択した状態でVBAを実行する方法を、全くVBAを使ったことのない者に分かるように教えてください。やりたいことは下記のNo.1の回答に書かれていることです。 http://okwave.jp/qa/q7089060.html とりあえずこれだけできたらいいのです。 他の言語でのプログラミング経験はあります。

  • エクセルで片対数グラフを書きたいのですが

    添付図のように、エクセルを使って片対数グラフを書きたいです。 図では、□、△、○の3つの異なる条件について、N/N0の時間変化について書かれていますが、この図のように、一枚のグラフに3つもグラフを書くようにするにはどうしたらいいのかがわかりません。 まずエクセルで、数値を代入して、挿入→散布図と押して、直線のグラフ自体は書けるのですが、縦軸を対数目盛にするにはどうしたらいいのかがわかりません。また、x軸とy軸に任意の文字を入力する方法についても教えていただけたらと思います。 まとめると、 (1)3つの異なるグラフを一枚のグラフに表すにはどうすればよいか (2)図のように縦軸が対数になるようにするにはどうすればよいか (3)各軸において任意の文字を入力するにはどうすればよいか について教えてください。お願いします。

  • Excel vba テーブルに列を挿入できない

    Excel vba で、次のコードでテーブルに列を挿入しています。 これはExcel2013で作った一連のvbaコードの一部です。 Range("テーブル名" & "[[#Headers],[地区]]").Select Selection.EntireColumn.Insert 「地区」フィールドの前に列を挿入するものです。 Excel2010、2013では問題なくできますが、Excel2016のPCでは   Selection.EntireColumn.Insertでエラーになります。エラーメッセージは、 「この操作を実行するとワークシート上のテーブル内でセルが移動されてしまうため、この操作は実行されません。」というもので、列を挿入するのだから、当然セルは移動されますが、それがダメだと。 エラーになった同じテーブルで手動での列挿入はできます。また、そのマクロ記録を取れば、上のコードと同じ記録ができます。 OSはWindows10です。 このvbaはExcel2016では通らないのでしょうか。エラーを解決する方法を教えてください。

  • EXCEL2010 VBA グラフの作成

    EXCEL2010のVBAで自動でグラフを作成するコードを作成したいと思っています。 シート1のA1:A10にデータが入っていて、ボタンを押すとコードが実行されて A1:A5までが系列1 A6:A10までが系列2 として表示される折れ線グラフを作成しようと思っています。 さらに作成したグラフは新規にシートを作成して作成したシートに表示させたいと思います。 このような処理を行いたいのですがVBAを始めたばかりなのでグラフの作成くらいしかまだ 分かっていません。 どなたかこの処理を実現できる良い方法を教えてください。よろしくお願いします。

  • エクセル vba クリック~離した位置へ直線の挿入

    エクセル vba クリック~離した位置へ直線の挿入 エクセルの図形挿入の、左クリックした位置(x1,y1)から始まり、離した位置(x2,y2)で終わる『直線』のようなマクロをご教示頂けないでしょうか? マクロの記録では何も出てきません。。。 それを応用してCADの寸法線のような絵を描くマクロを作成したく考えております。 どなたか宜しくお願い致します。

  • ExcelのVBAでのグラフ操作について

    Excel2003からExcel2010にアップグレードしたのですが、グラフ操作について質問があります。 Excelのブックにグラフシートがあり、それをVBAで操作した後、2003では ActiveChart.Deselect で選択を解除できたのですが、2010には同じ構文が使用できません。 同様の操作を2010で行うためにはどうすればよいのでしょうか?

  • Excelで行の挿入を繰り返し行う

    Excel2000を使用しています。 今、データが1万件程あるExcelシートの各行の間に8行ずつ挿入したいのですが、VBAなどを教えてください。 よろしくお願いいたします。

  • EXCEL2007のグラフについて

    EXCEL2007のグラフについて 毎日1個づつデータをグラフ上に追加したい場合です。 今はそのつど(すなわち毎日)、昨日までのグラフを 削除して、今日のデータを追加した新しいグラフを 作成しています。 昨日までのグラフ上に今日のデータを追加して新しい グラフとする方法を教えていただけませんか。 ちなみにグラフ作成方法は 挿入→散布図→散布図(直線とマーカー) で作成しています。

専門家に質問してみよう