本記事では、業務レポートや技術報告書に貼り付ける散布図のフォーマットを、VBAで一括設定する方法をご紹介いたします。
人に結果を説明するためにレポートや報告書にグラフを貼り付けることはよくあります。しかし、Excelのデフォルトのグラフはそのままでは報告書に適したスタイルになっていません。手作業で毎回フォント・軸・色を整えるのは手間がかかりますし、グラフの数が多いとスタイルにばらつきも出ます。
VBAで書式を定義しておけば、グラフを選択してマクロを実行するだけで、統一されたスタイルが適用されます。一度コードを作成しておけば、以降のレポートでも同じ品質のグラフを繰り返し作成できます。
本記事では、サンプルコードの提示に加えて、各プロパティの意味と変更方法も解説しています。報告書の体裁やルールに合わせて、ご自身で設定を調整できるようにすることを目指しています。
目次
サンプルコードで設定する内容
本記事のサンプルコードでは、以下のフォーマットを適用します。
| 設定項目 | 内容 | 採用理由 |
|---|---|---|
| グラフサイズ | 幅150mm × 高さ100mm | A4用紙(デフォルト余白)に2つ並べて収まるサイズ |
| フォント | Times New Roman 9pt | 報告書・論文で標準的に使用されるフォント |
| グリッド線 | 淡いグレー(極細) | データの値を読み取りやすくしつつ、主張しすぎない |
| 軸の色 | 薄めのグレー | グリッド線と調和し、全体を柔らかい印象にする |
| プロット背景 | ごく薄いグレー | データ領域を視覚的に区別する |
| 凡例 | グラフ上部、枠線なし | データ領域を圧迫しない配置 |
| 系列の区別 | 色+線種+マーカー形状 | 白黒印刷でもデータ系列を識別可能 |
これらの設定値はすべてコード内で変更できます。各項目の変更方法は後述の解説セクションで詳しく説明いたします。
アクティブチャートについて
Excel上でクリックして選択したグラフをアクティブチャートと呼びます。
アクティブチャートは唯一つしか存在せず、複数のグラフがアクティブチャートになることはありません。つまり、Ctrlキーを押しながらクリックしたグラフはアクティブチャートにはなりません。
本記事のサンプルプログラムでは、このアクティブチャートに対してフォーマットを適用します。複数のグラフに一括適用する方法は、後半の応用セクションで紹介いたします。
サンプルプログラム
サンプルプログラムを以下に示します。各設定項目の意味とカスタマイズ方法については、次のセクションで詳しく解説いたします。
Sub アクティブチャートの散布図の書式変更()
Dim mm_to_pt As Double
Dim TargetChart As Chart
mm_to_pt = 2.8346457
Dim graphWidth As Double, graphHeight As Double
graphWidth = 150 * mm_to_pt
graphHeight = 100 * mm_to_pt
If Not ActiveChart Is Nothing Then
Set TargetChart = ActiveChart
' --- グラフ全体 ---
With TargetChart
.HasTitle = False
.ChartArea.Border.LineStyle = xlNone
.Parent.Width = graphWidth
.Parent.Height = graphHeight
End With
' --- 凡例 ---
TargetChart.HasLegend = True
With TargetChart.Legend
.Position = xlLegendPositionTop
.Border.LineStyle = xlNone
.Format.Fill.ForeColor.RGB = RGB(255, 255, 255)
.Format.Shadow.Visible = False
With .Font
.Name = "Times New Roman"
.Size = 9
.Bold = False
End With
End With
' --- X軸 ---
With TargetChart.Axes(xlCategory, xlPrimary)
.HasTitle = True
.MajorGridlines.Delete
.HasMajorGridlines = True
.MajorGridlines.Border.Color = RGB(200, 200, 200)
.MajorGridlines.Border.Weight = xlHairline
.HasMinorGridlines = False
.Border.Color = RGB(180, 180, 180)
.MajorTickMark = xlTickMarkOutside
.MinorTickMark = xlTickMarkNone
With .TickLabels.Font
.Name = "Times New Roman"
.Size = 9
End With
With .AxisTitle.Font
.Name = "Times New Roman"
.Size = 9
End With
End With
' --- Y軸 ---
With TargetChart.Axes(xlValue, xlPrimary)
.HasTitle = True
.MajorGridlines.Delete
.HasMajorGridlines = True
.MajorGridlines.Border.Color = RGB(200, 200, 200)
.MajorGridlines.Border.Weight = xlHairline
.HasMinorGridlines = False
.Border.Color = RGB(180, 180, 180)
.MajorTickMark = xlTickMarkOutside
.MinorTickMark = xlTickMarkNone
With .TickLabels.Font
.Name = "Times New Roman"
.Size = 9
End With
With .AxisTitle.Font
.Name = "Times New Roman"
.Size = 9
End With
End With
' --- プロットエリア ---
With TargetChart.PlotArea
.Border.LineStyle = xlContinuous
.Border.Color = RGB(180, 180, 180)
.Border.Weight = 1
.Format.Fill.ForeColor.RGB = RGB(248, 248, 248)
.Format.Fill.Visible = msoTrue
.Width = graphWidth * 0.88
.Height = graphHeight * 0.8
.Left = graphWidth * 0.07
.Top = graphHeight * 0.1
End With
' --- 系列1:teal(青緑)・実線・丸マーカー ---
With TargetChart.SeriesCollection(1)
.MarkerStyle = xlMarkerStyleCircle
.MarkerSize = 6
.MarkerForegroundColor = RGB(33, 150, 168)
.MarkerBackgroundColor = RGB(33, 150, 168)
.Format.Line.ForeColor.RGB = RGB(33, 150, 168)
.Format.Line.Weight = 2
End With
Else
MsgBox "グラフが選択されていません"
End If
End Subコードの詳細解説とカスタマイズ方法
サンプルプログラムの各ブロックについて、プロパティの意味と変更方法を解説いたします。報告書の体裁ルールに合わせて調整する際の参考にしてください。
グラフサイズの設定
mm_to_pt = 2.8346457
graphWidth = 150 * mm_to_pt
graphHeight = 100 * mm_to_ptExcelの内部ではサイズの単位に「ポイント(pt)」を使用しますが、直感的に分かりにくいため、ミリメートル(mm)で指定してからポイントに変換しています。mm_to_pt は「1mm ≒ 2.83pt」という変換係数です。
現在の設定では幅150mm×高さ100mmとなっており、Microsoft WordのA4サイズのレイアウトで余白がデフォルトの場合に、ページ1枚に2つのグラフが貼り付けられるサイズになっています。
報告書のレイアウトに応じて以下のように変更できます。
| 用途 | graphWidth | graphHeight |
|---|---|---|
| A4に2つ並べる(デフォルト) | 150 * mm_to_pt | 100 * mm_to_pt |
| A4に1つ大きく貼る | 160 * mm_to_pt | 120 * mm_to_pt |
| PowerPointのスライド向け | 200 * mm_to_pt | 130 * mm_to_pt |
| 報告書の補足資料(小さめ) | 80 * mm_to_pt | 60 * mm_to_pt |
グラフ全体の設定
With TargetChart
.HasTitle = False
.ChartArea.Border.LineStyle = xlNone
.Parent.Width = graphWidth
.Parent.Height = graphHeight
End With| プロパティ | 意味 | 設定値 |
|---|---|---|
| .HasTitle | グラフタイトルの表示/非表示 | Trueで表示、Falseで非表示 |
| .ChartArea.Border.LineStyle | グラフの外枠 | xlNoneで非表示、xlContinuousで実線表示 |
| .Parent.Width / .Height | グラフ全体のサイズ | 先ほど設定した変数を使用 |
報告書ではグラフのタイトルを本文やキャプション(図番号)で記述することが多いため、デフォルトでは非表示にしています。グラフ単体で意味が通る必要がある場合は、以下のように変更します。
.HasTitle = True
.ChartTitle.Text = "温度と応力の関係"
.ChartTitle.Font.Name = "Times New Roman"
.ChartTitle.Font.Size = 11凡例の設定
TargetChart.HasLegend = True
With TargetChart.Legend
.Position = xlLegendPositionTop
.Border.LineStyle = xlNone
.Format.Fill.ForeColor.RGB = RGB(255, 255, 255)
.Format.Shadow.Visible = False
With .Font
.Name = "Times New Roman"
.Size = 9
.Bold = False
End With
End With| プロパティ | 意味 | 設定値 |
|---|---|---|
| .HasLegend | 凡例の表示/非表示 | Trueで表示 |
| .Position | 凡例の配置位置 | 下表を参照 |
| .Border.LineStyle | 凡例の枠線 | xlNoneでなし、xlContinuousで実線 |
| .Format.Fill.ForeColor.RGB | 凡例の背景色 | RGB値で指定 |
| .Format.Shadow.Visible | 影の有無 | Trueであり、Falseでなし |
凡例の配置で使用できる値は以下の通りです。
| 値 | 配置位置 |
|---|---|
| xlLegendPositionTop | グラフの上 |
| xlLegendPositionBottom | グラフの下 |
| xlLegendPositionLeft | グラフの左 |
| xlLegendPositionRight | グラフの右 |
デフォルトではグラフ上部に配置し、枠線・影なしとしています。これはプロットエリアを最大限確保するためです。報告書のフォーマットで凡例に枠線が必要な場合は、以下のように変更します。
.Border.LineStyle = xlContinuous
.Border.Color = RGB(0, 0, 0)軸の設定(X軸・Y軸共通)
X軸とY軸は設定内容がほぼ同じです。ここではX軸のコードで解説しますが、Y軸も同様に変更できます。
With TargetChart.Axes(xlCategory, xlPrimary)
.HasTitle = True
.MajorGridlines.Delete
.HasMajorGridlines = True
.MajorGridlines.Border.Color = RGB(200, 200, 200)
.MajorGridlines.Border.Weight = xlHairline
.HasMinorGridlines = False
.Border.Color = RGB(180, 180, 180)
.MajorTickMark = xlTickMarkOutside
.MinorTickMark = xlTickMarkNone
End With軸の指定方法について補足いたします。
| 引数 | 意味 |
|---|---|
| xlCategory | X軸(横軸) |
| xlValue | Y軸(縦軸) |
| xlPrimary | 第1軸(通常の軸) |
各プロパティの意味は以下の通りです。
| プロパティ | 意味 | 設定値 |
|---|---|---|
| .HasTitle | 軸ラベルの表示 | Trueで表示 |
| .HasMajorGridlines | 主グリッド線の表示 | Trueで表示 |
| .MajorGridlines.Border.Color | グリッド線の色 | RGB値で指定 |
| .MajorGridlines.Border.Weight | グリッド線の太さ | 下表を参照 |
| .HasMinorGridlines | 補助グリッド線の表示 | Falseで非表示 |
| .Border.Color | 軸そのものの色 | RGB値で指定 |
| .MajorTickMark | 主目盛の表示方向 | 下表を参照 |
| .MinorTickMark | 補助目盛の表示方向 | 下表を参照 |
線の太さで使用できる値は以下の通りです。
| 値 | 太さ |
|---|---|
| xlHairline | 極細(グリッド線に最適) |
| xlThin | 細い |
| xlMedium | 中くらい |
| xlThick | 太い |
目盛の方向で使用できる値は以下の通りです。
| 値 | 表示 |
|---|---|
| xlTickMarkOutside | 外向き |
| xlTickMarkInside | 内向き |
| xlTickMarkCross | 内外両方向 |
| xlTickMarkNone | 非表示 |
報告書のルールによっては、グリッド線なし・軸を黒・目盛を内向きにする場合もあります。その場合は以下のように変更します。
.HasMajorGridlines = False
.Border.Color = RGB(0, 0, 0)
.MajorTickMark = xlTickMarkInside
.MinorTickMark = xlTickMarkInside軸ラベルの文字を設定する場合は以下の通りです。報告書では単位を明記することが多いため、必要に応じて変更してください。
.HasTitle = True
.AxisTitle.Text = "温度 (℃)"なお、グリッド線の設定は、一度 .MajorGridlines.Delete で削除してから .HasMajorGridlines = True で再作成する手順が必要です。この手順を省くと、Excelのバージョンによってはエラーが発生することがあります。
プロットエリアの設定
プロットエリアとは、グラフの中でデータが実際に描画される四角い領域のことです。
With TargetChart.PlotArea
.Border.LineStyle = xlContinuous
.Border.Color = RGB(180, 180, 180)
.Border.Weight = 1
.Format.Fill.ForeColor.RGB = RGB(248, 248, 248)
.Format.Fill.Visible = msoTrue
.Width = graphWidth * 0.88
.Height = graphHeight * 0.8
.Left = graphWidth * 0.07
.Top = graphHeight * 0.1
End With| プロパティ | 意味 | 設定値 |
|---|---|---|
| .Border.LineStyle | 枠線のスタイル | xlContinuousで実線、xlNoneで非表示 |
| .Border.Color | 枠線の色 | RGB値で指定 |
| .Border.Weight | 枠線の太さ | ポイント単位の数値(1 = 細い、2 = やや太い) |
| .Format.Fill.ForeColor.RGB | 背景色 | RGB値で指定 |
| .Format.Fill.Visible | 背景色を有効にするか | msoTrueで有効 |
| .Width / .Height | プロットエリアのサイズ | グラフサイズに対する割合で指定 |
| .Left / .Top | プロットエリアの位置 | グラフサイズに対する割合で指定 |
サイズと位置は graphWidth * 0.88 のようにグラフ全体に対する割合で指定しています。この書き方にしておくと、グラフのサイズを変更してもプロットエリアのバランスが崩れません。
報告書のルールで背景色が不要な場合は、以下のように変更します。
.Format.Fill.Visible = msoFalse
.Border.Color = RGB(0, 0, 0)
.Border.Weight = 1.5データ系列の設定(色・線種・マーカー)
グラフに表示されるデータの線やマーカー(プロット点)のスタイルを変更します。SeriesCollection(1) が1番目の系列、SeriesCollection(2) が2番目の系列という意味です。
' --- 系列1 ---
With TargetChart.SeriesCollection(1)
.MarkerStyle = xlMarkerStyleCircle
.MarkerSize = 6
.MarkerForegroundColor = RGB(33, 150, 168)
.MarkerBackgroundColor = RGB(33, 150, 168)
.Format.Line.ForeColor.RGB = RGB(33, 150, 168)
.Format.Line.Weight = 2
End With| プロパティ | 意味 | 設定値 |
|---|---|---|
| .MarkerStyle | マーカーの形 | 下表を参照 |
| .MarkerSize | マーカーの大きさ | 2〜72の数値(6〜8が標準的) |
| .MarkerForegroundColor | マーカーの前景色(輪郭) | RGB値で指定 |
| .MarkerBackgroundColor | マーカーの背景色(塗りつぶし) | RGB値で指定 |
| .Format.Line.ForeColor.RGB | 線の色 | RGB値で指定 |
| .Format.Line.Weight | 線の太さ | ポイント単位の数値(1.5〜2.5が見やすい) |
| .Format.Line.DashStyle | 線のスタイル | 下表を参照 |
マーカーの形で使用できる値は以下の通りです。
| 値 | 形状 |
|---|---|
| xlMarkerStyleCircle | ● 丸 |
| xlMarkerStyleDiamond | ◆ ひし形 |
| xlMarkerStyleSquare | ■ 四角 |
| xlMarkerStyleTriangle | ▲ 三角 |
| xlMarkerStyleX | × バツ印 |
| xlMarkerStylePlus | + プラス記号 |
| xlMarkerStyleNone | マーカーなし(線のみ) |
線のスタイルで使用できる値は以下の通りです。
| 値 | スタイル |
|---|---|
| msoLineSolid | ─── 実線 |
| msoLineDash | − − − 破線 |
| msoLineDot | ・・・ 点線 |
| msoLineDashDot | −・−・ 一点鎖線 |
| msoLineDashDotDot | −・・−・・ 二点鎖線 |
報告書では白黒印刷されることも多いため、本サンプルでは色だけでなく線種(実線・破線)とマーカー形状(丸・ひし形)の3要素で系列を区別しています。系列が2つ以上ある場合は、以下のようにブロックを追加します。
' --- 系列2:緑・点線・三角マーカー ---
With TargetChart.SeriesCollection(2)
.MarkerStyle = xlMarkerStyleTriangle
.MarkerSize = 6
.MarkerForegroundColor = RGB(39, 174, 96)
.MarkerBackgroundColor = RGB(39, 174, 96)
.Format.Line.ForeColor.RGB = RGB(39, 174, 96)
.Format.Line.Weight = 2
.Format.Line.DashStyle = msoLineDot
End Withマーカーの輪郭と塗りつぶしを別の色にする(中抜きマーカー)場合は以下のようになります。白黒印刷時に系列を区別する手段としても有効です。
.MarkerForegroundColor = RGB(33, 150, 168) ' 輪郭:teal
.MarkerBackgroundColor = RGB(255, 255, 255) ' 塗りつぶし:白RGB値のリファレンス
色の指定は RGB(赤, 緑, 青) で行います。各値は0〜255です。報告書で使いやすい色をまとめました。
| 色 | RGB値 | 用途例 |
|---|---|---|
| 黒 | RGB(0, 0, 0) | 軸、枠線 |
| 白 | RGB(255, 255, 255) | 背景、中抜きマーカー |
| 濃いグレー | RGB(80, 80, 80) | 補助的な線 |
| 薄いグレー | RGB(200, 200, 200) | グリッド線 |
| teal(青緑) | RGB(33, 150, 168) | 系列 |
| オレンジ | RGB(230, 126, 34) | 系列 |
| 青 | RGB(26, 95, 168) | 系列 |
| 赤 | RGB(200, 50, 50) | 系列 |
| 緑 | RGB(39, 174, 96) | 系列 |
| 紫 | RGB(128, 90, 200) | 系列 |
ExcelのGUIで確認した色をVBAで使用したい場合は、「セルの書式設定」→「フォント」→「色」→「その他の色」→「ユーザー設定」タブで、赤・緑・青の数値を確認できます。
使い方
Excelの「開発」メニューから「Visual Basic」を選択すると、VBAが開きます。
プロジェクトの中のツリーからVBAコードを追加したいブックを選択し、右クリックします。そして、「挿入」の中から「標準モジュール」をクリックすれば、標準モジュールがプロジェクトに追加されますので、その中にコードをコピーします。
なお、「開発」タブが表示されていない場合は、「ファイル」→「オプション」→「リボンのユーザー設定」を開き、右側の一覧から「開発」にチェックを入れてください。
Excelに戻って、通常どおりグラフを作成します。具体的には、データを範囲選択して、「挿入」メニューのグラフから散布図を選択します。それにより、散布図のグラフが作成されます。
この作成されたグラフはフォーマットが初期(デフォルト)のものになっています。
このグラフを左クリックして、「開発」メニューの「マクロ」から先ほどコピーしたコードを実行します。これにより、フォーマットが適用されてグラフの見栄えが整えられます。
応用(複数のグラフに一括適用する)
報告書では同じ書式のグラフを複数枚作成することがよくあります。アクティブチャートだけではなく、Ctrlキーを押しながら複数のグラフをクリックした場合にも、そのすべてのグラフにフォーマットを適用できるコードを以下に示します。
Sub 選択中の複数のグラフをまとめて書式変更()
Dim TargetChart As Chart
Dim ChartObj As ChartObject
Application.ScreenUpdating = False
On Error GoTo errorProc
If ActiveChart Is Nothing Then
' アクティブチャートがない場合
For Each ChartObj In Selection
ChartObj.Activate
Set TargetChart = ActiveChart
Call changeFormat(TargetChart)
Next
Else
' アクティブチャートがある場合
Set TargetChart = ActiveChart
Call changeFormat(TargetChart)
End If
errorProc:
Application.ScreenUpdating = True
End Sub
Private Sub changeFormat(TargetChart As Chart)
Dim mm_to_pt As Double
Dim graphWidth As Double, graphHeight As Double
mm_to_pt = 2.8346457
graphWidth = 150 * mm_to_pt
graphHeight = 100 * mm_to_pt
' --- グラフ全体 ---
With TargetChart
.HasTitle = False
.ChartArea.Border.LineStyle = xlNone
.Parent.Width = graphWidth
.Parent.Height = graphHeight
End With
' --- 凡例 ---
TargetChart.HasLegend = True
With TargetChart.Legend
.Position = xlLegendPositionTop
.Border.LineStyle = xlNone
.Format.Fill.ForeColor.RGB = RGB(255, 255, 255)
.Format.Shadow.Visible = False
With .Font
.Name = "Times New Roman"
.Size = 9
.Bold = False
End With
End With
' --- X軸 ---
With TargetChart.Axes(xlCategory, xlPrimary)
.HasTitle = True
.MajorGridlines.Delete
.HasMajorGridlines = True
.MajorGridlines.Border.Color = RGB(200, 200, 200)
.MajorGridlines.Border.Weight = xlHairline
.HasMinorGridlines = False
.Border.Color = RGB(180, 180, 180)
.MajorTickMark = xlTickMarkOutside
.MinorTickMark = xlTickMarkNone
With .TickLabels.Font
.Name = "Times New Roman"
.Size = 9
End With
With .AxisTitle.Font
.Name = "Times New Roman"
.Size = 9
End With
End With
' --- Y軸 ---
With TargetChart.Axes(xlValue, xlPrimary)
.HasTitle = True
.MajorGridlines.Delete
.HasMajorGridlines = True
.MajorGridlines.Border.Color = RGB(200, 200, 200)
.MajorGridlines.Border.Weight = xlHairline
.HasMinorGridlines = False
.Border.Color = RGB(180, 180, 180)
.MajorTickMark = xlTickMarkOutside
.MinorTickMark = xlTickMarkNone
With .TickLabels.Font
.Name = "Times New Roman"
.Size = 9
End With
With .AxisTitle.Font
.Name = "Times New Roman"
.Size = 9
End With
End With
' --- プロットエリア ---
With TargetChart.PlotArea
.Border.LineStyle = xlContinuous
.Border.Color = RGB(180, 180, 180)
.Border.Weight = 1
.Format.Fill.ForeColor.RGB = RGB(248, 248, 248)
.Format.Fill.Visible = msoTrue
.Width = graphWidth * 0.88
.Height = graphHeight * 0.8
.Left = graphWidth * 0.07
.Top = graphHeight * 0.1
End With
' --- 系列1:teal・実線・丸マーカー ---
With TargetChart.SeriesCollection(1)
.MarkerStyle = xlMarkerStyleCircle
.MarkerSize = 6
.MarkerForegroundColor = RGB(33, 150, 168)
.MarkerBackgroundColor = RGB(33, 150, 168)
.Format.Line.ForeColor.RGB = RGB(33, 150, 168)
.Format.Line.Weight = 2
End With
End Subアクティブチャートがある場合は、前の処理と同じです。アクティブチャートがない場合には、以下の部分で選択したもの(Selection)からチャートを取り出し、それをアクティブチャートにして、前の処理と同じことを行います。
For Each ChartObj In Selection
ChartObj.Activate
Set TargetChart = ActiveChart
Call changeFormat(TargetChart)
Next処理の共通部分は、changeFormat という名前のサブルーチンとしてまとめました。書式設定を変更したい場合は、この changeFormat の中身だけを修正すれば、単体でも複数でも同じ設定が適用されます。
使い方
グラフが1つの場合には、このグラフを左クリックして、「開発」メニューの「マクロ」から先ほどコピーしたコードを実行します。
グラフが複数の場合には、Ctrlキーを押しながら複数のグラフを左クリックして選択状態にし、「開発」メニューの「マクロ」から先ほどコピーしたコードを実行します。
これにより、フォーマットが適用されてグラフの見栄えが整えられます。
PNGで画像として保存する方法
整形したグラフを画像として保存したい場合は、プロットエリアの設定のあとに以下のコードを追加します。報告書に高解像度の画像を貼り付けたい場合に便利です。
TargetChart.Export "C:\Users\YourName\Desktop\Chart.png", "PNG""C:\Users\YourName\Desktop\Chart.png" を変更すれば、保存場所とファイル名を変更できます。
まとめ
業務レポートや技術報告書に使用する散布図のフォーマットを、VBAで一括設定する方法をご紹介しました。
本記事では、サンプルコードの提示に加えて、各プロパティの意味と使用できる定数の一覧、報告書のルールに合わせた変更例も掲載しています。リファレンス表を参照しながら値を変更することで、ご自身の報告書の体裁に合ったグラフスタイルを作成できます。
このサンプルプログラムを一から書くと面倒ですが、一度作成しておけば修正は簡単です。ご参考になりましたら幸いです。
