ユーザーが「月を選択すると、その月のデータだけがグラフに表示される」
そんな 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. 選択月を毎回ボタンで更新したい場合(ボタンと連動)
- Excel の開発タブ →「挿入」→「ボタン(フォームコントロール)」
- シートに配置
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 ダッシュボードらしい「動的な分析」が可能になります。
コメント