5
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

vba グラフの作る方法

Last updated at Posted at 2015-06-20

結論

テンプレに埋め込みグラフを作っておいて、適当なイベントで内容を更新する方が簡単だった

調べたこと

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

参考

5
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?