【VBA】範囲が変わると自動的にグラフも更新される構成にする

通常のグラフでは、データの追加・削除のたびに範囲を手動で変更しなければなりません。しかし、“範囲が変わったら自動でグラフも最新化される仕組み” を作っておくと、実務に強い運用ができます。

本記事では、データ範囲が増減した際に自動でグラフが再設定される仕組みを、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の処理量が減り、エラーも起きにくくなります。

例:

  1. A1:B1 を含む範囲を選択して Ctrl + T でテーブル化
  2. グラフの元データをそのテーブルに変更
  3. あとは Change イベントで再描画だけすればOK

5. 名前付き範囲による自動更新も可能

INDEX関数を使った動的範囲の例:

=Sheet1!$A$2:INDEX(Sheet1!$A:$A,COUNTA(Sheet1!$A:$A))

この名前をグラフの元データに設定すれば、
データ量に応じてグラフが自動伸縮します。


6. まとめ

  • シート変更イベントを使えば、データ更新と同時にグラフが更新される
  • UpdateChartRangeを使って最終行を毎回再計算
  • テーブル化動的名前範囲を組み合わせるとさらに効率的

コメント

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