【VBA】テーブルと連動した動的グラフの作成

Excelのテーブル(ListObject)は、データが追加されると自動で範囲が拡張されるため、
VBAと組み合わせることで最も安定した動的グラフの仕組みを作ることができます。

テーブルを使うメリットは以下のとおりです。

  • データ行の追加・削除に強い
  • 数式・フォーマット・グラフが崩れにくい
  • グラフの参照範囲が自動で更新され、メンテナンス不要
  • 実務で大量データを扱う際に非常に便利

本記事では、テーブルと連動したグラフをVBAで作る方法を詳しく解説します。


1. テーブルを利用するメリットと基本構成

Excelテーブル(ListObject)を使用すると、
行が増えても 最終行を意識せずグラフが自動更新 されます。

● テーブル名:SalesTable

  • A列:日付
  • B列:売上

● 作成するグラフ

  • Sheet「Graph」上に縦棒グラフを設置
  • テーブルと完全連動して範囲自動更新

2. テーブルを参照するグラフの作成手順(VBA)

以下のVBAでは:

  • テーブルの列全体を X 軸・Y 軸として参照
  • グラフのデータ範囲がテーブルの拡張に常に追従
  • グラフ名を「売上推移グラフ」として管理しやすく命名
Sub CreateChartFromTable()
    Dim wsData As Worksheet
    Dim wsGraph As Worksheet
    Dim lo As ListObject
    Dim co As ChartObject
    Dim tblName As String

    Set wsData = Sheets("Data")
    Set wsGraph = Sheets("Graph")

    'テーブルを取得
    tblName = "SalesTable"
    Set lo = wsData.ListObjects(tblName)

    'グラフ作成
    Set co = wsGraph.ChartObjects.Add(Left:=50, Top:=50, Width:=450, Height:=300)

    '名前を付ける
    co.Name = "売上推移グラフ"

    With co.Chart
        .ChartType = xlColumnClustered
        
        'テーブル列を直接参照(動的範囲)
        .SetSourceData Source:=lo.Range   'テーブル全体
        
        '系列配列に細かく設定する場合
        .SeriesCollection(1).XValues = lo.ListColumns("日付").DataBodyRange
        .SeriesCollection(1).Values = lo.ListColumns("売上").DataBodyRange
        
        .ChartTitle.Text = "売上推移"
    End With
End Sub

3. コード解説(実務で重要なポイント)

● .SetSourceData Source:=lo.Range

テーブル全体を参照するため、
行が追加されても自動で反映 される最も強力な方法。


● .XValues = lo.ListColumns("日付").DataBodyRange

列名で参照できるため、列の位置が変わっても壊れない。


● co.Name = "売上推移グラフ"

グラフの名前を付けておくと、
後で再利用・更新・削除が非常にしやすくなる。


4. テーブルにデータ追加 → グラフが自動更新される仕組み

テーブルは「データの追加=範囲拡張」が自動で行われます。

そのため、以下を行うだけでグラフが自動更新されます。

● 方法A:テーブルの最終行に値を記入

日付    売上
1/1     1200
1/2     1300
1/3     1250 ← 新規追加

● 方法B:VBAで新規行を追加

Sub AddRowToTable()
    Dim lo As ListObject
    Set lo = Sheets("Data").ListObjects("SalesTable")

    lo.ListRows.Add
    lo.DataBodyRange(lo.ListRows.Count, 1).Value = Date
    lo.DataBodyRange(lo.ListRows.Count, 2).Value = 1500
End Sub

→ グラフが自動的に更新されるため、再描画処理すら不要です。


5. グラフの更新を手動で強制したい場合(任意)

稀にExcelの描画が追いつかないときがあります。
その場合は次のコードで再描画できます。

co.Chart.Refresh
co.Chart.PlotArea.Select

6. まとめ

テーブル(ListObject)とグラフを組み合わせると、

  • 動的な範囲管理が不要
  • 行追加してもグラフが自動更新
  • 列名で参照するためコードが壊れにくい
  • 実務のデータ管理に最も適した方法
  • グラフ名などと組み合わせると自動化がさらに進む

コメント

タイトルとURLをコピーしました