結論
テンプレに埋め込みグラフを作っておいて、適当なイベントで内容を更新する方が簡単だった
調べたこと
VBA でグラフを作る方法
経過
- マクロでグラフ作成手順を記録
- ActiveChart とかいう謎の変数にキレる
- 「chartAdd chartAdd2 違い」でググる
- chartObject.setSourceData が動かなくて一時的に死ぬ
- Axes オブジェクトのリンクが無くて迷子になる
- Qiita で愚痴る ← いまここ
結果
- いわゆるグラフは worksheet オブジェクトの chartObjects コレクションに格納されている
- グラフは chartObject オブジェクトと chart オブジェクトから構成される
- chartObject はグラフの大きさや位置の情報を持っている
- グラフのデータは chart オブジェクトが持っている。chartObject.chart で取得できる。
- shapes.chartAdd メソッドでもグラフを追加できるが、リファレンスが狂っているので見なかったことにする。
VBA
Sub test()
Dim source, position
Set source = Range("A1") ' グラフのデータソースとなる表の左上のセル
Set position = Range("E1") ' グラフを貼り付けたい位置
Dim sheet
Set sheet = ActiveSheet
' 既存の埋め込みグラフを全て消す(sheet.chartObjects.deleteが動かない?
Dim o
For Each o In sheet.ChartObjects
o.Delete
Next
' 埋め込みグラフは chartObjects コンテナに入っているので、
' 最初に chartObjects コンテナに新しいグラフを追加する
' chart_o で受け取っている戻り値は、埋め込みグラフを表す chartObject オブジェクト
Dim chart_o
Set chart_o = sheet.ChartObjects.Add(position.Left, position.Top, position.Width * 10, position.Height * 20)
' 埋め込みグラフは位置や大きさなどを定義している chartObject に
' 実際のグラフが格納される形になっているため
' chartObject から chart を取り出して値を設定していく
Dim chart
Set chart = chart_o.chart
Call chart.SetSourceData(source.CurrentRegion)
With chart
.ChartType = xlXYScatterLinesNoMarkers ' 散布図
.HasTitle = True
.ChartTitle.Text = "hogehoge"
End With
' 縦軸ラベルの設定
With chart.Axes(xlValue)
.HasTitle = True
.AxisTitle.Text = "fuga"
.MaximumScale = 100
.AxisTitle.Orientation = xlHorizontal
End With
' 横軸ラベルの設定(時系列の場合)
With chart.Axes(xlCategory)
.MaximumScale = 1
.MajorUnit = 4.16666666666667E-02 ' ラベルの間隔が 1 時間ごとになるよう微調整している
.TickLabels.Orientation = xlTickLabelOrientationUpward
.HasTitle = True
.AxisTitle.Text = "poge"
End With
End Sub