【VBA】条件付きでグラフ表示を切り替える(例:選択された月だけグラフ化)

ユーザーが「月を選択すると、その月のデータだけがグラフに表示される」
そんな Excel ダッシュボードのような仕組みを、VBA で簡単に作る方法を解説します。


1. 条件付きでグラフを更新する基本の考え方

グラフが参照するデータ範囲を、
VBA で動的に切り替えることによって実現できます。

よく使うパターンは以下の 2 つ。

パターン説明
A. グラフの Series(系列) の値を直接変更するSeriesCollection(i).Values に範囲をセット
B. 名前付き範囲(Name)を切り替えてグラフに紐づける名前を変更するだけでグラフが自動更新

今回は A の直接変更方式 を中心に扱います。


2. 例:選択された月だけグラフ化するしくみ

▼ 想定データ

  • A列:月(1〜12)
  • B列:売上
  • C1:選択したい月(ユーザーが入力)
月   売上
1    100
2    120
3    90
...

「C1 に入力された月の売上データだけをグラフに反映する」
というシナリオです。


3. VBA のサンプルコード(選択月のデータだけ表示)

Sub UpdateChartByMonth()
    Dim ws As Worksheet
    Dim chartObj As ChartObject
    Dim targetMonth As Long
    Dim lastRow As Long
    Dim r As Long
    
    Set ws = ThisWorkbook.Worksheets("Sheet1")
    Set chartObj = ws.ChartObjects("売上グラフ") '←グラフ名称
    
    'ユーザーが選択した月(C1)
    targetMonth = ws.Range("C1").Value
    
    '最終行
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
    
    '該当月を検索してグラフのデータ範囲を更新
    For r = 2 To lastRow
        If ws.Cells(r, "A").Value = targetMonth Then
            
            With chartObj.Chart.SeriesCollection(1)
                .XValues = ws.Range("A" & r) '月
                .Values = ws.Range("B" & r)  '売上
                .Name = "=""選択月の売上"""    '表示名
            End With
            
            MsgBox targetMonth & "月のデータに更新しました。"
            Exit Sub
        End If
    Next r
    
    MsgBox "該当する月が見つかりません。"
End Sub

▼ ポイント解説

  • SeriesCollection(1)
    グラフの1番目の系列を操作
  • XValues / Values
    X 軸と実データを1行だけに変更しているため、
    「その月だけの棒グラフ」などが表示される
  • 月が見つからない場合はメッセージを出すようにしているため運用時に安心

4. 選択月を毎回ボタンで更新したい場合(ボタンと連動)

  1. Excel の開発タブ →「挿入」→「ボタン(フォームコントロール)」
  2. シートに配置
  3. UpdateChartByMonth を割り当てる

ボタンを押すだけでグラフが自動更新される仕組みになります。


5. SERIES のデータを「1行だけ」にする以外のパターン

▼ パターン1:該当月“より前”までの累計だけ表示

例:4月を選んだら 1〜4月の売上を表示。

With chartObj.Chart.SeriesCollection(1)
    .Values = ws.Range("B2:B" & r)
    .XValues = ws.Range("A2:A" & r)
End With

▼ パターン2:該当月 ±3か月の範囲を表示

Dim startRow As Long, endRow As Long

startRow = WorksheetFunction.Max(2, r - 3)
endRow = WorksheetFunction.Min(lastRow, r + 3)

With chartObj.Chart.SeriesCollection(1)
    .Values = ws.Range("B" & startRow & ":B" & endRow)
    .XValues = ws.Range("A" & startRow & ":A" & endRow)
End With

用途に合わせて自在に変更できます。


6. 名前付き範囲を使う(応用・よりスマート)

「グラフのシリーズには名前付き範囲を設定しておき、
名前の参照先だけ VBA で切り替える」

という方法もあります。

▼ 名前定義例

SelectedMonthValue = Sheet1!$B$5
SelectedMonthLabel = Sheet1!$A$5

あとは VBA でこれを切り替えるだけ。

Names("SelectedMonthValue").RefersTo = "=Sheet1!$B$" & r
Names("SelectedMonthLabel").RefersTo = "=Sheet1!$A$" & r

グラフは自動で更新されるため、
SeriesCollection を直接触らなくてもよくなります。

管理がラクになるため、多数のグラフを扱うダッシュボードで特に有効


7. まとめ

テーマ内容
条件でグラフを切り替える方法SeriesCollection を動的に変更する
使いどころ月、担当者、商品などの絞り込み表示
応用累積表示・範囲表示・前後比較
大規模管理なら名前付き範囲を併用すると便利

選択した条件に応じてグラフが変わることで、
Excel ダッシュボードらしい「動的な分析」が可能になります。

コメント

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