【VBA】魅せるグラフの完全自動生成(グラフ作成と書式設定)

VBA

はじめに

第5回では、VBAを使ってデータから統計量や移動平均を計算する方法を学びました。しかし、数字の羅列だけでは、データの持つ傾向やパターンを直感的に理解するのは困難です。そこで重要になるのが、分析結果を視覚的に表現する「グラフ」です。

今回は、VBAを使ってグラフの作成から書式設定までを完全に自動化する方法を学びます。手作業でグラフを一つずつ作成・更新する手間から解放され、誰が見ても分かりやすい分析レポートの作成を目指しましょう。

1. なぜグラフ作成を自動化するのか?

  • 再現性と一貫性: 毎回同じデザイン・フォーマットのグラフを正確に作成できます。
  • 効率性: 何種類ものグラフを作成する場合や、定期的に同じグラフを更新する場合に、作業時間を劇的に短縮できます。
  • 動的な対応: 分析対象のデータ範囲が変動しても、VBAなら自動で範囲を認識してグラフを更新できます。

2. グラフ作成の基本手順

VBAでグラフを操作する際は、主にChartObjectまたはChartオブジェクトを扱います。基本的な手順は以下の通りです。

  1. グラフの器を追加ChartObjects.Addメソッドで、グラフを配置するための「器(ChartObject)」をシート上に追加します。
  2. データソースを設定: 作成したグラフのChart.SetSourceDataメソッドで、グラフの元となるデータ範囲を指定します。
  3. グラフの種類を設定Chart.ChartTypeプロパティで、折れ線、棒、円などの種類を指定します。
  4. 詳細な書式設定: タイトル、軸ラベル、凡例、色などをプロパティで細かく設定します。

3. グラフ作成の実践

それでは、A列に日付、B列に株価のデータがあるとして、その推移を示す折れ線グラフを作成してみましょう。

Sub CreateStockChart()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("Sheet1")

    Dim dataRange As Range
    Dim lastRow As Long

    ' グラフのデータ範囲を動的に取得
    ' B列の最終行を基に、A1セルからB列の最終行までの範囲を指定します。
    lastRow = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row
    Set dataRange = ws.Range("A1:B" & lastRow)

    ' --- グラフ作成開始 ---

    ' 1. 既存のグラフをすべて削除してから新しいグラフを追加
    ' 同じ位置に複数のグラフが重なるのを防ぎます。
    Dim chartObj As ChartObject
    For Each chartObj In ws.ChartObjects
        chartObj.Delete
    Next chartObj

    ' 新しいグラフをシートに追加
    ' 場所(左端からの距離, 上端からの距離)とサイズ(幅, 高さ)を指定します。
    Set chartObj = ws.ChartObjects.Add(Left:=150, Top:=100, Width:=400, Height:=250)

    ' 2. グラフの種類を設定
    ' `xlLine`は折れ線グラフを意味します。
    chartObj.Chart.ChartType = xlLine

    ' 3. データソースを設定
    ' 取得したデータ範囲をグラフの元データとして設定します。
    chartObj.Chart.SetSourceData Source:=dataRange

    ' 4. 詳細な書式設定
    With chartObj.Chart
        ' グラフタイトルを設定
        .HasTitle = True
        .ChartTitle.Text = "株価推移"
        .ChartTitle.Font.Size = 14

        ' 凡例を削除
        .HasLegend = False

        ' 横軸(項目軸)の書式設定
        With .Axes(xlCategory)
            .HasTitle = True
            .AxisTitle.Text = "日付"
        End With

        ' 縦軸(数値軸)の書式設定
        With .Axes(xlValue)
            .HasTitle = True
            .AxisTitle.Text = "株価(円)"
            .TickLabels.NumberFormat = "#,##0" ' 3桁区切りの表示形式を設定
        End With
    End With

    MsgBox "グラフを作成しました。"
End Sub
  • Set ws = ThisWorkbook.Worksheets("Sheet1"): コードを読みやすくするため、対象シートをwsという変数に入れています。
  • ws.ChartObjects.Add(...): シート上にグラフオブジェクトの「器」を追加します。
  • .ChartType = xlLine: グラフの種類を「折れ線」に設定しています。
  • With chartObj.Chart ... End WithWithブロックを使うと、chartObj.Chartの記述を省略して、そのプロパティに連続してアクセスできます。コードがすっきりして読みやすくなります。
  • .Axes(xlCategory) / .Axes(xlValue): それぞれグラフの横軸と縦軸を指します。

4. 既存グラフの操作

既にシート上にあるグラフを操作することも可能です。グラフの名前を指定してChartObjectを取得します。

Sub UpdateExistingChart()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("Sheet1")

    Dim chartObj As ChartObject
    ' "グラフ 1" という名前のグラフを取得 (名前はグラフを選択した時に数式バーの左に表示される)
    Set chartObj = ws.ChartObjects("グラフ 1")

    ' 新しいデータ範囲でグラフを更新
    Dim newDataRange As Range
    ' (データ範囲の取得ロジックは省略)
    ' Set newDataRange = ... 
    
    chartObj.Chart.SetSourceData Source:=newDataRange

    ' タイトルを更新
    chartObj.Chart.ChartTitle.Text = "最新の株価推移"
End Sub

まとめ

今回は、VBAによるグラフ作成の自動化を学びました。

  • ws.ChartObjects.Add(...)でグラフの器を作り、各種プロパティを設定していくのが基本フロー。
  • データ範囲を動的に取得することで、データの増減に自動で対応できるグラフが作れる。
  • Withブロックを使うと、書式設定のコードがすっきりする。

数値データとグラフが揃い、基本的なレポートの部品はすべて出揃いました。次回からは、いよいよこれまでの知識を総動員して、より実用的なツールを作成する「プロジェクト」に挑戦します。まずは、ユーザーが操作しやすい入力画面(ユーザーフォーム)の作成から始めましょう。

コメント