通常のグラフでは、データの追加・削除のたびに範囲を手動で変更しなければなりません。しかし、“範囲が変わったら自動でグラフも最新化される仕組み” を作っておくと、実務に強い運用ができます。
本記事では、データ範囲が増減した際に自動でグラフが再設定される仕組みを、VBAで構築する方法を解説します。
目次
1. 自動更新の仕組みを作るための基本方針
データ範囲が変わったときに自動反映させるには、以下のいずれかの方法が必要です。
① シートの変更イベント(Worksheet_Change)で自動更新
→ データが追加・削除された瞬間にグラフを更新する
② テーブル化(ListObject)+構造化参照
→ 範囲を自動で広げるExcel標準機能を活用し、VBAは最小限
③ 名前付き範囲(動的範囲)を使う
→ OFFSET関数やINDEX関数で可変的な範囲を定義し、グラフにセット
実務で最も柔軟に運用できるのは①イベント+VBAの組み合わせです。
2. Worksheet_Changeイベントで自動的にグラフを更新する
以下では、データの入力があったら自動でグラフを更新する構成を実装します。
- シート:
Sheet1 - データ範囲:A列(X軸)、B列(Y軸)
- グラフ名:
Chart 1
次のコードを Sheet1 のモジュール に記述します。
Private Sub Worksheet_Change(ByVal Target As Range)
'A列またはB列に変更があった時だけ実行
If Intersect(Target, Me.Range("A:B")) Is Nothing Then Exit Sub
Call UpdateChartRange
End Sub
さらに、標準モジュールに「UpdateChartRange」を準備します:
Sub UpdateChartRange()
Dim ws As Worksheet
Dim lastRow As Long
Dim chartObj As ChartObject
Dim rngX As Range
Dim rngY As Range
Set ws = ThisWorkbook.Worksheets("Sheet1")
'A列の最終行を取得
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
'X軸とY軸に使う範囲を定義
Set rngX = ws.Range("A2:A" & lastRow)
Set rngY = ws.Range("B2:B" & lastRow)
'グラフオブジェクトを取得
Set chartObj = ws.ChartObjects("Chart 1")
'グラフの元データを最新範囲に更新
With chartObj.Chart
.SeriesCollection(1).XValues = rngX
.SeriesCollection(1).Values = rngY
End With
End Sub
3. コードの動き
● データ変更を監視するイベント
Worksheet_Change はセルの変更を検知します。
A列・B列に入力があったときだけ UpdateChartRange を実行します。
● 最終行を取得して範囲を更新
データの追加・削除に応じて、グラフが即時に更新されます。
● 自動更新のメリット
- 手動修正が不要
- 集計テンプレートとして使える
- 過不足のない表示が常に保たれる
- 実務(売上管理・日次ログなど)で非常に便利
4. テーブル化(ListObject)を併用するとさらに強力
テーブル化しておくと:
- データ追加時に自動で行が伸びる
- 範囲の管理が簡単
- 構造化参照でグラフとの紐付けが安定
VBAの処理量が減り、エラーも起きにくくなります。
例:
- A1:B1 を含む範囲を選択して Ctrl + T でテーブル化
- グラフの元データをそのテーブルに変更
- あとは Change イベントで再描画だけすればOK
5. 名前付き範囲による自動更新も可能
INDEX関数を使った動的範囲の例:
=Sheet1!$A$2:INDEX(Sheet1!$A:$A,COUNTA(Sheet1!$A:$A))
この名前をグラフの元データに設定すれば、
データ量に応じてグラフが自動伸縮します。
6. まとめ
- シート変更イベントを使えば、データ更新と同時にグラフが更新される
- UpdateChartRangeを使って最終行を毎回再計算
- テーブル化や動的名前範囲を組み合わせるとさらに効率的
コメント