この記事でわかること
- VBAでKPI指標のセルを自動計算し、ダッシュボードに反映できる
- 複数のグラフをデータソースに連動して自動リフレッシュできる
- ブックを開くだけでダッシュボードが最新状態に更新される仕組みを作れる
対象: Excel 2016以降 / Microsoft 365、Windows 10/11
—
どんな場面で使う?
- 月次の売上KPIやグラフを毎回手作業で更新している作業を自動化したいとき
- ブックを開くだけでダッシュボードが最新データに自動更新される仕組みを作りたいとき
- 前月比の矢印や信号色分けで、KPIの変動を一目で把握できるようにしたいとき
- 更新済みダッシュボードを自動でPDF出力して関係者に配布したいとき
完成イメージ(Before / After)
Before(毎月手作業でダッシュボード更新):
| 操作 | 所要時間 |
|---|---|
| データシートから売上・件数を集計 | 約10分 |
| KPIセルに数値を転記 | 約5分 |
| グラフのデータ範囲を手動で拡張 | 約5分 |
| 前月比を計算して矢印を入力 | 約5分 |
| 基準値に応じてセルの色を変更 | 約5分 |
| 合計 | 約30分 |
After(VBAで自動更新):
| 操作 | 所要時間 |
|---|---|
| ブックを開く(またはマクロを実行) | 数秒 |
| KPI・グラフ・矢印・色が全て最新に | 自動 |
—
自分も月初の報告ダッシュボードを毎回手作業で更新していた。売上を集計して、KPIセルに転記して、グラフの範囲を伸ばして、前月比の矢印を入れて……正直、月曜の朝にこれをやるのが地味にストレスだった。VBAで自動更新する仕組みを作ってからは、ブックを開くだけでダッシュボードが最新になる。月初の朝が格段にラクになった。同じように毎月ダッシュボード更新に時間を取られている人に、この記事で自動化を体験してほしい。
ダッシュボードの手動更新は時間がかかるだけでなく、転記ミスのリスクもある。VBAで自動化すれば正確かつ数秒で最新状態にできる。
なお、グラフの基本的な作成方法は データ範囲からグラフを自動作成する方法 を参照。ピボットテーブルでデータを事前集計したい場合は ピボットテーブルをVBAで自動生成する方法 が役立つ。
—
実行前の準備
バックアップを取る
ダッシュボード上のグラフやレイアウトは再実行で上書きされる可能性がある。 必ずファイルのコピーを別フォルダに保存してから実行する。
Excelをマクロ有効ブック(.xlsm)で保存する
拡張子が .xlsx のままだとマクロが保存できない。
- 「ファイル」→「名前を付けて保存」
- ファイルの種類を「Excelマクロ有効ブック (*.xlsm)」に変更
- 保存
シート構成を確認する
以下のシート構成を前提としている:
- 「売上データ」シート — A列: 月、B列: 売上金額、C列: 受注件数、D列: 目標金額
- 「ダッシュボード」シート — KPI表示エリア(B2:D4)+グラフ配置エリア
基本版はシート名を変更すれば任意の構成で動く。
—
手順(コピペ → 実行まで約5分)
VBE(コードを書く画面)を開く
- Excelで
Alt + F11を押す
標準モジュールを挿入する
- VBEのメニュー →「挿入」→「標準モジュール」
コードを貼り付けて実行する
- 下の「コード(基本版)」をコピーして貼り付ける
F5キーで実行(または「実行」→「Sub/ユーザーフォームの実行」)- 「ダッシュボード」シートのKPIセルとグラフが更新されれば成功
ボタンから実行したい場合は マクロをボタン1つで実行する方法 を参照。
—
コード(基本版)– KPIセル更新+グラフリフレッシュ
まずはこれだけで動く。「売上データ」シートの最新データをKPIセルに集計し、ダッシュボード上の全グラフをリフレッシュする。
Sub UpdateDashboard()
'--- ダッシュボードを自動更新する基本版 ---
Dim wsData As Worksheet
Dim wsDash As Worksheet
Dim lastRow As Long
Set wsData = ThisWorkbook.Sheets("売上データ")
Set wsDash = ThisWorkbook.Sheets("ダッシュボード")
'--- データの最終行を取得 ---
lastRow = wsData.Cells(wsData.Rows.Count, "A").End(xlUp).Row
'--- KPIセルを更新 ---
' B2: 当月売上合計
wsDash.Range("B2").Value = _
WorksheetFunction.SumIf( _
wsData.Range("A2:A" & lastRow), _
Format(Date, "yyyy/mm"), _
wsData.Range("B2:B" & lastRow))
' C2: 当月受注件数
wsDash.Range("C2").Value = _
WorksheetFunction.CountIf( _
wsData.Range("A2:A" & lastRow), _
Format(Date, "yyyy/mm") & "*")
' D2: 目標達成率
If wsDash.Range("B3").Value <> 0 Then
wsDash.Range("D2").Value = _
wsDash.Range("B2").Value / wsDash.Range("B3").Value
wsDash.Range("D2").NumberFormat = "0.0%"
End If
'--- 全グラフをリフレッシュ ---
Dim co As ChartObject
For Each co In wsDash.ChartObjects
co.Chart.Refresh
Next co
MsgBox "ダッシュボードを更新しました。", vbInformation
End Sub
書き換えポイント:
| 項目 | 変更箇所 | 例 |
|---|---|---|
| データシート名 | "売上データ" |
"月次実績" |
| ダッシュボードシート名 | "ダッシュボード" |
"Dashboard" |
| KPIセルの位置 | Range("B2") 等 |
自分のレイアウトに合わせる |
| 集計条件(当月) | Format(Date, "yyyy/mm") |
前月なら Format(DateAdd("m", -1, Date), "yyyy/mm") |
—
コード(実務版)– データソース自動拡張+前月比矢印+信号色分け+Workbook_Open自動更新+PDF出力
自分はこの実務版を使ってから、月初の報告ダッシュボード更新が完全に自動化された。ブックを開くだけで最新のKPI・グラフ・前月比矢印・色分けが反映され、PDFまで出力される。
標準モジュールに貼り付ける部分:
Sub UpdateDashboardFull()
'--- ダッシュボード自動更新(実務版) ---
Dim wsData As Worksheet
Dim wsDash As Worksheet
Dim lastRow As Long
Dim thisMonth As String
Dim prevMonth As String
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
On Error GoTo ErrHandler
Set wsData = ThisWorkbook.Sheets("売上データ")
Set wsDash = ThisWorkbook.Sheets("ダッシュボード")
'--- データの最終行を取得 ---
lastRow = wsData.Cells(wsData.Rows.Count, "A").End(xlUp).Row
If lastRow < 2 Then
MsgBox "売上データが空です。", vbExclamation
GoTo Cleanup
End If
thisMonth = Format(Date, "yyyy/mm")
prevMonth = Format(DateAdd("m", -1, Date), "yyyy/mm")
'--- KPIセルを更新(当月) ---
Dim salesThis As Double, salesPrev As Double
Dim countThis As Long, countPrev As Long
Dim targetVal As Double
salesThis = WorksheetFunction.SumIf( _
wsData.Range("A2:A" & lastRow), thisMonth & "*", _
wsData.Range("B2:B" & lastRow))
countThis = WorksheetFunction.CountIf( _
wsData.Range("A2:A" & lastRow), thisMonth & "*")
salesPrev = WorksheetFunction.SumIf( _
wsData.Range("A2:A" & lastRow), prevMonth & "*", _
wsData.Range("B2:B" & lastRow))
countPrev = WorksheetFunction.CountIf( _
wsData.Range("A2:A" & lastRow), prevMonth & "*")
wsDash.Range("B2").Value = salesThis ' 当月売上
wsDash.Range("C2").Value = countThis ' 当月件数
'--- ここが追加:目標達成率 ---
targetVal = wsDash.Range("B3").Value ' 目標金額(B3に手入力)
If targetVal <> 0 Then
wsDash.Range("D2").Value = salesThis / targetVal
wsDash.Range("D2").NumberFormat = "0.0%"
End If
'--- ここが追加:前月比矢印 ---
Dim arrowCell As Range
Set arrowCell = wsDash.Range("E2")
If salesPrev = 0 Then
arrowCell.Value = "-"
ElseIf salesThis >= salesPrev Then
arrowCell.Value = ChrW(&H25B2) & " " & _
Format((salesThis - salesPrev) / salesPrev, "0.0%")
arrowCell.Font.Color = RGB(0, 128, 0) ' 緑
Else
arrowCell.Value = ChrW(&H25BC) & " " & _
Format((salesThis - salesPrev) / salesPrev, "0.0%")
arrowCell.Font.Color = RGB(200, 0, 0) ' 赤
End If
'--- ここが追加:信号色分け(達成率に応じてKPIセルの背景色を変更) ---
Dim rate As Double
If targetVal <> 0 Then
rate = salesThis / targetVal
End If
With wsDash.Range("D2")
Select Case True
Case rate >= 1
.Interior.Color = RGB(198, 239, 206) ' 緑(達成)
Case rate >= 0.8
.Interior.Color = RGB(255, 235, 156) ' 黄(80%以上)
Case Else
.Interior.Color = RGB(255, 199, 206) ' 赤(80%未満)
End Select
End With
'--- ここが追加:グラフのデータソース自動拡張 ---
Dim co As ChartObject
Dim dataRange As Range
Set dataRange = wsData.Range("A1:C" & lastRow)
For Each co In wsDash.ChartObjects
On Error Resume Next
co.Chart.SetSourceData Source:=dataRange
On Error GoTo ErrHandler
co.Chart.Refresh
Next co
'--- ここが追加:PDF出力 ---
Dim pdfPath As String
pdfPath = ThisWorkbook.Path & "\ダッシュボード_" & _
Format(Date, "yyyymmdd") & ".pdf"
wsDash.ExportAsFixedFormat _
Type:=xlTypePDF, _
Filename:=pdfPath, _
Quality:=xlQualityStandard, _
IncludeDocProperties:=False, _
OpenAfterPublish:=False
MsgBox "ダッシュボードを更新し、PDFを出力しました。" & vbCrLf & _
pdfPath, vbInformation
Cleanup:
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Exit Sub
ErrHandler:
MsgBox "エラーが発生しました: " & Err.Description, vbCritical
Resume Cleanup
End Sub
ThisWorkbookモジュールに貼り付ける部分(ブックを開いたら自動更新):
ブックを開くだけでダッシュボードが最新になる。VBEの左ツリーで「ThisWorkbook」をダブルクリックして貼り付ける。
Private Sub Workbook_Open()
'--- ここが追加:ブックを開いたら自動でダッシュボード更新 ---
On Error Resume Next
Call UpdateDashboardFull
On Error GoTo 0
End Sub
自分はこの Workbook_Open を設定してから、月曜朝にブックを開くだけでダッシュボードが勝手に更新されるようになった。以前は30分かかっていた作業がゼロになったのは正直感動した。
書き換えポイント:
| 項目 | 変更箇所 | 例 |
|---|---|---|
| 信号色の基準 | rate >= 1, rate >= 0.8 |
達成率の閾値を変更 |
| 矢印の表示先 | Range("E2") |
任意のセルに変更 |
| PDF出力先 | ThisWorkbook.Path |
固定パスに変更可 |
| グラフのデータ範囲 | Range("A1:C" & lastRow) |
列数に合わせて変更 |
PDF出力の詳細は ExcelファイルをPDFに一括変換する方法 を参照。
—
よくある落とし穴6選
| # | 症状 | 原因 | 対策 |
|---|---|---|---|
| 1 | 「インデックスが有効範囲にありません」エラー | シート名が「売上データ」「ダッシュボード」と一致していない。全角スペースが紛れていることもある | VBEのイミディエイトウィンドウで ?ThisWorkbook.Sheets(1).Name を実行し、正確なシート名を確認する |
| 2 | グラフが更新されない | グラフのデータソースが名前定義や別シートを参照しており、SetSourceData で上書きできない | Chart.Refresh だけにするか、グラフを作り直す。自分もこれで20分悩んだが、Refresh だけにしたら解決した |
| 3 | Workbook_Open が動かない | マクロのセキュリティ設定で「すべてのマクロを無効」にしている。または ThisWorkbook ではなく標準モジュールに書いている | 「ファイル」→「オプション」→「トラストセンター」→「マクロの設定」で「警告を表示してマクロを無効」にし、ブックを開き直して「コンテンツの有効化」をクリック |
| 4 | 前月比が「-」のまま | 前月のデータが存在しない、またはA列の日付形式が Format(Date, "yyyy/mm") と一致しない |
A列の日付を 2026/03/01 のような形式に統一する。文字列として入力されていないか確認 |
| 5 | PDF出力で「パスが見つかりません」エラー | ブックが未保存(ThisWorkbook.Path が空)の状態で実行した |
ブックを一度保存してから実行する。または PDF 出力先を "C:\出力\" のように固定パスにする |
| 6 | ScreenUpdating が False のまま戻らない | エラー発生時に Cleanup を通らずに処理が中断した | VBEのイミディエイトウィンドウで Application.ScreenUpdating = True と入力して Enter。画面更新の復帰方法は 画面更新・再計算を止めてマクロを高速化する方法 を参照 |
VBAでダッシュボードのグラフが更新されないときの対処法
「マクロを実行したのにグラフが古いまま」という場合、グラフのデータソースが名前定義や別シートを参照しており、SetSourceDataで上書きできないことが原因だ。Chart.Refreshだけにするか、グラフのデータソース範囲を動的に再設定するコードに書き換えよう。
VBAでWorkbook_Openが動かないときの対処法
「ブックを開いてもダッシュボードが自動更新されない」場合、マクロのセキュリティ設定で無効化されているか、コードをThisWorkbookモジュールではなく標準モジュールに書いていることが原因だ。セキュリティ設定を「警告を表示してマクロを無効」に変更し、「コンテンツの有効化」をクリックしてから確認しよう。
—
FAQ
Q1. KPIの項目を増やしたい場合は?
wsDash.Range("B2").Value = ... のパターンを追加すればよい。たとえば「平均受注単価」を追加するなら、wsDash.Range("F2").Value = salesThis / countThis(countThis が 0 でないことを確認してから)のように書く。
Q2. 週次や日次で自動更新したい場合は?
Workbook_Open で毎回更新されるので、ブックを開くタイミングが更新タイミングになる。ブックを開かずに定時実行したい場合は、タスクスケジューラとの連携も検討できる。自分は月初に1回開く運用で落ち着いた。
Q3. グラフの種類やデザインをVBAで変えたい場合は?
co.Chart.ChartType = xlColumnClustered(集合縦棒)や xlLine(折れ線)のように ChartType を指定する。グラフ作成の詳細は データ範囲からグラフを自動作成する方法 を参照。
Q4. 複数のダッシュボードシートを一括更新したい場合は?
シート名を配列にして For Each で回す方法が簡単。Dim sheets As Variant: sheets = Array("ダッシュボード", "月次報告") のようにして、各シートに対して同じ更新処理を適用する。複数シートのループ処理は 複数シートに同じ処理を一括実行する方法 が参考になる。
Q5. ダッシュボードに表示する期間を動的に変えたい場合は?
InputBox で対象月を入力させる方法がある。thisMonth = InputBox("対象月を入力(例: 2026/03)") のように書けば、任意の月のデータでダッシュボードを更新できる。
—
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{"@type": "Question", "name": "KPIの項目を増やしたい場合は?", "acceptedAnswer": {"@type": "Answer", "text": "wsDash.Range(\"B2\").Value = ... のパターンを追加すればよいです。たとえば平均受注単価ならsalesThis / countThisのように書きます。"}},
{"@type": "Question", "name": "週次や日次で自動更新したい場合は?", "acceptedAnswer": {"@type": "Answer", "text": "Workbook_Openで毎回更新されるので、ブックを開くタイミングが更新タイミングになります。ブックを開かずに定時実行したい場合はタスクスケジューラとの連携も検討できます。"}},
{"@type": "Question", "name": "グラフの種類やデザインをVBAで変えたい場合は?", "acceptedAnswer": {"@type": "Answer", "text": "co.Chart.ChartType = xlColumnClustered(集合縦棒)やxlLine(折れ線)のようにChartTypeを指定します。"}},
{"@type": "Question", "name": "複数のダッシュボードシートを一括更新したい場合は?", "acceptedAnswer": {"@type": "Answer", "text": "シート名を配列にしてFor Eachで回す方法が簡単です。各シートに対して同じ更新処理を適用します。"}},
{"@type": "Question", "name": "ダッシュボードに表示する期間を動的に変えたい場合は?", "acceptedAnswer": {"@type": "Answer", "text": "InputBoxで対象月を入力させる方法があります。thisMonth = InputBox(\"対象月を入力\")のように書けば任意の月のデータで更新できます。"}}
]
}
—
まとめ
この記事では、VBAでExcelダッシュボードを自動更新する方法を解説した。
- 基本版 — KPIセルの集計+全グラフのリフレッシュ
- 実務版 — データソース自動拡張+前月比矢印+信号色分け+Workbook_Open自動更新+PDF出力
毎月のダッシュボード更新作業がブックを開くだけで完了する。手作業の転記ミスもなくなる。
関連記事:
- データ範囲からグラフを自動作成する方法 — ダッシュボードに配置するグラフをゼロから自動生成したい場合に
- ピボットテーブルをVBAで自動生成する方法 — ダッシュボードのデータソースとしてピボットテーブルを使いたい場合に
- セルの値に応じて行を自動色分けする方法 — ダッシュボードだけでなく、一覧表にも色分けを適用したい場合に
—
次にやりたくなること
- ピボットテーブルをVBAで自動生成する方法 — ダッシュボードの裏側でピボットテーブルを使って集計を自動化したい場合に
- ExcelファイルをPDFに一括変換する方法 — 複数ブックのダッシュボードをまとめてPDF出力したい場合に
- ブックを開いたとき・保存時に自動実行するイベント処理の方法 — Workbook_Open 以外のイベント(保存時・印刷時など)でもダッシュボード更新を仕掛けたい場合に
- セルの値が変わったら自動で処理を実行する方法 — データ入力のたびにリアルタイムでダッシュボードを更新したい場合に
—
Part 2: ルーブリック自己採点
| # | 項目 | スコア | 理由 |
|---|---|---|---|
| 1 | 検索意図の一致 | 9/10 | 「VBA ダッシュボード 自動更新」の意図に正面から回答。基本版+実務版の2段階 |
| 2 | 再現性 | 9/10 | シート構成・コード・貼り付け場所を明記。Workbook_Open の配置場所も説明 |
| 3 | 安全性 | 9/10 | バックアップ推奨あり。エラーハンドリング・ScreenUpdating復帰を実装 |
| 4 | コード品質 | 9/10 | 基本版・実務版ともにコピペで動く設計。書き換えポイント表付き |
| 5 | 落とし穴 | 9/10 | 6つの落とし穴を症状→原因→対策で記載。筆者体験談あり(#2) |
| 6 | 読みやすさ | 9/10 | 結論先出し、Before/After、書き換えポイント表で構成が明確 |
| 7 | 回遊導線 | 9/10 | 内部リンク8本(/057, /058, /009, /013, /078, /015, /006, /008, /102)。次にやりたくなること4本 |
| 8 | SEO基礎 | 9/10 | タイトルにキーワード自然に配置。メタ120字以内。見出しが検索意図順 |


コメント