Technology

VBAでExcelの散布図を報告書・レポート向けに整形する方法

本記事では、業務レポートや技術報告書に貼り付ける散布図のフォーマットを、VBAで一括設定する方法をご紹介いたします。

人に結果を説明するためにレポートや報告書にグラフを貼り付けることはよくあります。しかし、Excelのデフォルトのグラフはそのままでは報告書に適したスタイルになっていません。手作業で毎回フォント・軸・色を整えるのは手間がかかりますし、グラフの数が多いとスタイルにばらつきも出ます。

VBAで書式を定義しておけば、グラフを選択してマクロを実行するだけで、統一されたスタイルが適用されます。一度コードを作成しておけば、以降のレポートでも同じ品質のグラフを繰り返し作成できます。

本記事では、サンプルコードの提示に加えて、各プロパティの意味と変更方法も解説しています。報告書の体裁やルールに合わせて、ご自身で設定を調整できるようにすることを目指しています。

目次

サンプルコードで設定する内容

本記事のサンプルコードでは、以下のフォーマットを適用します。

設定項目内容採用理由
グラフサイズ幅150mm × 高さ100mmA4用紙(デフォルト余白)に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_pt

Excelの内部ではサイズの単位に「ポイント(pt)」を使用しますが、直感的に分かりにくいため、ミリメートル(mm)で指定してからポイントに変換しています。mm_to_pt は「1mm ≒ 2.83pt」という変換係数です。

現在の設定では幅150mm×高さ100mmとなっており、Microsoft WordのA4サイズのレイアウトで余白がデフォルトの場合に、ページ1枚に2つのグラフが貼り付けられるサイズになっています。

報告書のレイアウトに応じて以下のように変更できます。

用途graphWidthgraphHeight
A4に2つ並べる(デフォルト)150 * mm_to_pt100 * mm_to_pt
A4に1つ大きく貼る160 * mm_to_pt120 * mm_to_pt
PowerPointのスライド向け200 * mm_to_pt130 * mm_to_pt
報告書の補足資料(小さめ)80 * mm_to_pt60 * 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

軸の指定方法について補足いたします。

引数意味
xlCategoryX軸(横軸)
xlValueY軸(縦軸)
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で一括設定する方法をご紹介しました。

本記事では、サンプルコードの提示に加えて、各プロパティの意味と使用できる定数の一覧、報告書のルールに合わせた変更例も掲載しています。リファレンス表を参照しながら値を変更することで、ご自身の報告書の体裁に合ったグラフスタイルを作成できます。

このサンプルプログラムを一から書くと面倒ですが、一度作成しておけば修正は簡単です。ご参考になりましたら幸いです。

-Technology
-