Excelでグラフを大量に作る5つの方法
Excelで店舗別の売上、装置ごとの測定値、都道府県別の人口などを整理していると、 同じデザインのグラフを何枚も作りたい場面があります。
5枚程度ならコピーで対応できますが、対象が20件、50件と増えると、データ範囲やタイトルを 1枚ずつ変更する作業は現実的ではありません。この記事では、作成枚数と利用環境に合わせた方法を、 VBAやOffice Scriptsのコード例とともに解説します。
先に結論:作成枚数に応じて方法を選ぶ
| 方法 | 枚数の目安 | 難易度 | 向いている場面 |
|---|---|---|---|
| グラフをコピー | 5~10枚 | 低 | 一度だけ少数のグラフを作る |
| グラフテンプレート | 5~20枚 | 低 | 複数ファイルでデザインを統一する |
| VBA | 10~100枚以上 | 中 | デスクトップ版Excelで繰り返し作る |
| Office Scripts | 10~100枚以上 | 中 | Microsoft 365やExcel Webで自動化する |
| 選択式グラフ | 1枚 | 低~中 | 画像を保存せず画面上で比較する |
| 外部ツール | 数十~数百枚 | 低 | コードを書かず同じ設定で一括作成する |
枚数は目安です。一度だけ作るのか、毎週・毎月繰り返すのかによっても適した方法は変わります。
この記事の内容
1. 大量のグラフを手作業で作る問題点
たとえば、20店舗について月別売上の縦棒グラフを作るとします。 手作業では、最初のグラフをコピーしたあと、データ範囲、タイトル、縦軸の範囲などを20回設定し直します。
- 参照範囲を1列ずらすなどのミスが起こりやすい
- 色、サイズ、軸の範囲がグラフごとに少しずつ変わる
- 元データが増えると、すべてのグラフを修正する必要がある
- グラフオブジェクトが増えるほどExcelファイルが重くなる
- 見た目が似ているため、間違ったグラフを見つけにくい
特に注意したいのは、見た目は正しくても参照している列が違うケースです。 報告書に貼り付けたあとで気づくと、グラフだけでなく説明文や資料も修正しなければなりません。
以降では、次の表から東京・大阪・福岡のグラフを1枚ずつ作る例を使います。
| 月 | 東京 | 大阪 | 福岡 |
|---|---|---|---|
| 1月 | 120 | 100 | 80 |
| 2月 | 135 | 115 | 95 |
| 3月 | 150 | 125 | 110 |
| 4月 | 145 | 130 | 120 |
A列を横軸、B列以降をグラフごとの縦軸データとして扱います。
2. 5~10枚ならグラフをコピーする
一度だけ作成するグラフが5~10枚程度なら、最初のグラフをコピーする方法が簡単です。
最初のグラフを作る
- A列の「月」とB列の「東京」を選択します。
- 「挿入」から「2-D 縦棒」の「集合縦棒」を選びます。
- グラフタイトル、色、サイズ、軸ラベルを整えます。
コピーしたグラフのデータを変える
- 完成したグラフをコピーします。
- コピーしたグラフを右クリックして「データの選択」を開きます。
- 系列名を大阪の見出しセル、系列値を大阪のデータ範囲へ変更します。
- グラフタイトルも「大阪」に変更します。
- 福岡についても同じ操作を行います。
この方法は、グラフが少なく、今後繰り返す予定がない場合に向いています。 毎月同じ作業をする場合や対象が数十件ある場合は、VBAの方が効率的です。
3. デザインはグラフテンプレートで統一する
複数のExcelファイルで同じデザインを使う場合は、完成したグラフをテンプレートとして保存できます。
作成したデザインをテンプレートとして保存する
- 色、フォント、凡例、軸などを設定したグラフを作ります。
- グラフを右クリックし、「テンプレートとして保存」を選択します。
- 名前を付けて
.crtx形式で保存します。
保存したテンプレートを別のグラフへ適用する
- デザインを変更したいグラフを選択し、「グラフの種類の変更」を開きます。
- 「すべてのグラフ」から「テンプレート」を選びます。
- 保存したテンプレートを選択し、「OK」を押します。
- ほかのグラフにも同じ操作を行います。
複数の担当者が同じ報告書を作る場合にも便利です。会社や研究室で標準テンプレートを用意しておけば、 色やフォントのばらつきを減らせます。
4. 数十枚ならVBAでグラフを一括作成する
数十枚以上のグラフを繰り返し作る場合はVBAが有効です。次のコードは、 「データ」シートのA列を横軸、B列以降を縦軸として、列ごとにマーカー付き折れ線グラフを作成します。 結果は「グラフ一覧」シートに2列で配置されます。
Worksheets("データ")で対象シートを見つけられません。
実行手順
- 表が入っているシート名を「データ」に変更します。
- Excelファイルを「Excelマクロ有効ブック(
.xlsm)」で保存します。 Alt+F11でVBAエディターを開きます。- 「挿入」から「標準モジュール」を選択します。
- 次のコードを貼り付けます。
- Excelに戻り、「表示」タブの「マクロ」から作成したマクロを選んで実行します。
Option Explicit
Sub 列ごとに折れ線グラフを一括作成()
Dim wsData As Worksheet
Dim wsChart As Worksheet
Dim chartObj As ChartObject
Dim lastRow As Long
Dim lastCol As Long
Dim col As Long
Dim leftPos As Double
Dim topPos As Double
On Error GoTo ErrorHandler
Set wsData = ThisWorkbook.Worksheets("データ")
' Get the output worksheet, or create it when it does not exist
On Error Resume Next
Set wsChart = ThisWorkbook.Worksheets("グラフ一覧")
On Error GoTo ErrorHandler
If wsChart Is Nothing Then
Set wsChart = ThisWorkbook.Worksheets.Add(After:=wsData)
wsChart.Name = "グラフ一覧"
End If
lastRow = wsData.Cells(wsData.Rows.Count, 1).End(xlUp).Row
lastCol = wsData.Cells(1, wsData.Columns.Count).End(xlToLeft).Column
If lastRow < 2 Or lastCol < 2 Then
MsgBox "グラフに使用できるデータがありません。", vbExclamation
Exit Sub
End If
Application.ScreenUpdating = False
' Delete charts from the previous run
Do While wsChart.ChartObjects.Count > 0
wsChart.ChartObjects(1).Delete
Loop
' Create one chart for each column from B onward
For col = 2 To lastCol
' Arrange charts in two columns
leftPos = 20 + ((col - 2) Mod 2) * 500
topPos = 20 + Int((col - 2) / 2) * 290
Set chartObj = wsChart.ChartObjects.Add( _
Left:=leftPos, _
Top:=topPos, _
Width:=460, _
Height:=250)
With chartObj.Chart
.ChartType = xlLineMarkers
.SeriesCollection.NewSeries
With .SeriesCollection(1)
.Name = CStr(wsData.Cells(1, col).Value)
.XValues = wsData.Range( _
wsData.Cells(2, 1), _
wsData.Cells(lastRow, 1))
.Values = wsData.Range( _
wsData.Cells(2, col), _
wsData.Cells(lastRow, col))
End With
.HasTitle = True
.ChartTitle.Text = CStr(wsData.Cells(1, col).Value)
.HasLegend = False
End With
Next col
Application.ScreenUpdating = True
MsgBox CStr(lastCol - 1) & "枚のグラフを作成しました。", vbInformation
Exit Sub
ErrorHandler:
Application.ScreenUpdating = True
MsgBox "グラフを作成できませんでした。" & vbCrLf & _
"シート名とデータの配置を確認してください。" & vbCrLf & _
"エラー内容:" & Err.Description, vbExclamation
End Sub
グラフの種類を変更する
この例では.ChartType = xlLineMarkersを指定しています。別の種類にする場合は、この部分を変更します。
| グラフ | VBAでの指定 |
|---|---|
| マーカー付き折れ線 | xlLineMarkers |
| 集合縦棒 | xlColumnClustered |
| 集合横棒 | xlBarClustered |
| 散布図 | xlXYScatter |
| 線付き散布図 | xlXYScatterLines |
| 円グラフ | xlPie |
店舗別の売上、装置別の温度や圧力、都道府県別の人口、試料別の測定結果などに応用できます。
VBAではChartObjects.Addを使い、グラフの位置、幅、高さを指定しています。
5. Microsoft 365ならOffice Scriptsを使う
Microsoft 365のExcelでは、Office Scriptsで繰り返し作業を自動化できます。 「自動化」タブが表示されている環境では、操作を記録したりTypeScript形式のコードを編集したりできます。
- 表が入っているシート名を「データ」にし、表の左上をA1セルに合わせます。
- Excelの「自動化」タブを開きます。
- 「新しいスクリプト」からコードエディターを開きます。
- 次のコードを貼り付けて保存します。
- スクリプトを実行し、「グラフ一覧」シートを確認します。
function main(workbook: ExcelScript.Workbook) {
const dataSheet: ExcelScript.Worksheet | undefined =
workbook.getWorksheet("データ");
if (!dataSheet) {
throw new Error("「データ」シートが見つかりません。");
}
const firstCell: ExcelScript.Range = dataSheet.getRange("A1");
if (firstCell.getText().trim() === "") {
throw new Error("A1セルから始まるデータ表が見つかりません。");
}
const dataRange: ExcelScript.Range =
firstCell.getSurroundingRegion();
const rowCount: number = dataRange.getRowCount();
const columnCount: number = dataRange.getColumnCount();
if (rowCount < 2 || columnCount < 2) {
throw new Error("グラフに使用できるデータがありません。");
}
let outputSheet: ExcelScript.Worksheet | undefined =
workbook.getWorksheet("グラフ一覧");
if (!outputSheet) {
outputSheet = workbook.addWorksheet("グラフ一覧");
}
outputSheet.getCharts().forEach(
(chart: ExcelScript.Chart) => chart.delete()
);
const seedRange: ExcelScript.Range =
outputSheet.getRange("A1:A2");
seedRange.setValues([
["Temporary"],
[0]
]);
const xRange: ExcelScript.Range =
dataSheet.getRangeByIndexes(
1,
0,
rowCount - 1,
1
);
let chartIndex: number = 0;
for (let col: number = 1; col < columnCount; col++) {
const title: string =
dataRange.getCell(0, col).getText().trim();
if (title === "") {
continue;
}
const yRange: ExcelScript.Range =
dataSheet.getRangeByIndexes(
1,
col,
rowCount - 1,
1
);
const chart: ExcelScript.Chart =
outputSheet.addChart(
ExcelScript.ChartType.line,
seedRange
);
chart.getSeries().forEach(
(existingSeries: ExcelScript.ChartSeries) =>
existingSeries.delete()
);
const series: ExcelScript.ChartSeries =
chart.addChartSeries(title);
series.setXAxisValues(xRange);
series.setValues(yRange);
chart
.getAxes()
.getCategoryAxis()
.setCategoryType(
ExcelScript.ChartAxisCategoryType.textAxis
);
chart.getTitle().setText(title);
chart.getLegend().setVisible(false);
chart.setWidth(460);
chart.setHeight(250);
chart.setLeft(20 + (chartIndex % 2) * 500);
chart.setTop(
20 + Math.floor(chartIndex / 2) * 290
);
chartIndex++;
}
seedRange.clear(
ExcelScript.ClearApplyTo.contents
);
}
Office Scriptsは、Excel Webを中心に使う場合、作業をチームで共有する場合、 Power AutomateなどのMicrosoft 365サービスと連携する場合に向いています。
6. 比較だけなら選択式グラフにする
大量に作りたい理由が「各項目を順番に比較したい」だけなら、何十枚も作らず、 1枚のグラフの表示内容をプルダウンで切り替える方法があります。
- H2セルに東京・大阪・福岡のプルダウンを作ります。
- I2セルに次の数式を入力し、下方向へコピーします。
- A列とI列を使ってグラフを1枚作成します。
この数式は、H2で選んだ地域が何列目にあるかをMATCHで調べ、
その列の値をINDEXで取り出します。H2を変えるとI列とグラフが切り替わります。
グラフタイトルも連動させる場合は、グラフタイトルを選択し、数式バーに次のように入力します。
選択式グラフは会議やダッシュボードに向き、Excelファイルも軽くできます。 一方、全店舗のグラフを報告書に貼る場合や、項目ごとに画像保存する場合には向きません。
7. コードを書かずにグラフを大量作成する方法
VBAやOffice Scriptsは便利ですが、コードの貼り付け、マクロの許可、ファイル形式の変更などが必要です。 会社のパソコンでは、セキュリティ設定によってマクロを実行できないこともあります。
コードを使わず一括作成する場合は、次の機能を持つツールを選びます。
- Excelの表をコピーして貼り付けられる
- CSVファイルを読み込める
- グループごとに同じ形式のグラフを作れる
- 色やサイズをまとめて設定できる
- 複数のグラフを画像として保存できる
この方法は、数十枚から数百枚を同じ設定で作りたい場合や、たまにしか大量作成しない場合に向いています。 コードを保守する必要もありません。
8. 桜チャートで実際にグラフを一括作成する手順
桜チャートでは、Excelの表をコピーして貼り付けるか、CSVファイルを読み込んでグラフを作成できます。
コードは不要です。複数のグラフを作る場合は、店舗名や装置名などを入力したLEVEL列を使います。
STEP 1:Excelでデータを縦方向に整理する
| LEVEL | 月 | 売上 |
|---|---|---|
| 東京 | 1月 | 120 |
| 東京 | 2月 | 135 |
| 東京 | 3月 | 150 |
| 大阪 | 1月 | 100 |
| 大阪 | 2月 | 115 |
| 大阪 | 3月 | 125 |
| 福岡 | 1月 | 80 |
| 福岡 | 2月 | 95 |
| 福岡 | 3月 | 110 |
LEVEL列を見るだけで「何を基準にグラフを分けるか」が分かり、対象が増えても管理しやすくなります。
棒グラフのX軸はカテゴリーとして扱われるため、月は1月、2月、3月のような文字列で入力できます。
Y軸に使う売上は数値のまま入力します。
STEP 2:表を貼り付ける
見出しを含めて表をコピーし、桜チャートの入力欄に貼り付けます。CSVファイルのアップロードも利用できます。
- 1行目に列名を入れる
- 表の途中に空白行を作らない
- 数値セルへ「円」「個」などの文字を入れない
- 「東京」「東京都」「東京店」などの表記揺れをなくす
STEP 3:X列・Y列・LEVEL列を選ぶ
- X列:月(値は「1月」「2月」「3月」の文字列)
- Y列:売上
- LEVEL列:LEVEL
- 表示方法:分割(LEVELごとに別のグラフを作成)
- グラフの種類:棒グラフ(集合縦棒)
STEP 4:見た目を設定する
タイトル、色、サイズ、凡例などを設定します。比較用のグラフでは、すべてのグラフで縦軸の範囲をそろえることが重要です。 グラフごとに縦軸が自動調整されると、小さな変化が大きく見えることがあります。
STEP 5:作成結果を確認する
- LEVELごとに正しく分かれているか
- X軸の順番が正しいか
- 値が数値として読み込まれているか
- タイトルと元データが一致しているか
- 縦軸の範囲が比較に適しているか
サンプルデータで試す
次のボタンから、東京・大阪・福岡のサンプルデータを入力した状態でグラフ作成画面へ進めます。
9. よくあるエラーと注意点
行と列が逆に認識される
Excelの「グラフのデザイン」から「行/列の切り替え」を試します。
VBAではXValuesとValuesを明示すると、意図しない切り替わりを防ぎやすくなります。
日付が正しい順番にならない
日付が文字列として保存されている可能性があります。表示形式を変えるだけでは日付データへ変換されない場合があるため、 Excelが日付として認識しているか確認してから並べ替えます。
数値がグラフに反映されない
「120円」「約100」「-」などの文字が含まれていないか確認します。 単位は値へ直接入力せず、セルの表示形式や軸ラベルで表します。
グラフ同士が重なる
VBAやOffice Scriptsで、作成番号に応じた横位置と縦位置を計算します。サンプルコードでは2列ずつ配置しています。
VBAマクロを実行できない
- ファイルが
.xlsxではなく.xlsmか確認する - 信頼できるファイルで「コンテンツの有効化」を選ぶ
- 会社や学校の管理設定でマクロが禁止されていないか確認する
- 重要なファイルではなく複製したファイルで試す
「自動化」タブが表示されない
Office Scriptsの利用可否は、Microsoft 365の契約内容や組織の設定によって異なります。表示されない場合は管理者へ確認します。
グラフを増やすとExcelが重くなる
Excel内に大量のグラフオブジェクトを置くと、表示や保存に時間がかかります。 比較だけなら選択式グラフにし、数百枚を一度に作る場合は画像として一括出力する方が管理しやすいことがあります。
まとめ
- 5~10枚なら、完成したグラフをコピーする
- 複数ファイルで見た目をそろえるなら、グラフテンプレートを使う
- 数十枚を繰り返し作るなら、VBAで自動化する
- Microsoft 365やExcel Webなら、Office Scriptsを検討する
- 比較だけなら、選択式グラフで1枚にまとめる
- コードを書かず大量に画像を作るなら、グラフ作成ツールを利用する
大量作成で重要なのは時間短縮だけではありません。同じ参照範囲、軸、デザインを使い、設定ミスを減らすことにも意味があります。 Excel内で完結させるならVBAやOffice Scripts、コードを使わず同じ形式でまとめて作るなら桜チャートを使い分けてください。