TECHNOLOGY

VBAでExcelのグラフ(散布図)の書式を設定する方法

人に結果を説明するためにレポートや報告書にグラフを貼り付けることはよくあります。

このようなグラフを含む資料を作成する場合には、グラフのサイズや書式などの見た目(フォーマット)を整えた方が見栄えがよくなります。

VBAを使うと手間なく、見た目を簡単に統一することができるため、一度作成しておくと作業効率を上げることができます。

本記事では、Excelの散布図のフォーマットをVBA(Microsoft Visual Basic for Applications)で設定する方法をご紹介いたします。

目次

アクティブチャートのグラフ(散布図)のフォーマットを変更する

はじめに

Excel上でクリックして選択したグラフをアクティブチャートと呼びます。

アクティブチャートは唯一つしか存在せず、複数のグラフがアクティブチャートになることはありません。つまり、Ctrlキーを押しながらクリックしたグラフはアクティブチャートにはなりません。

このアクティブチャートに対して、フォーマットを指定するサンプルプログラムを作成しました。

ご紹介するプログラムは、軸ラベルや軸の色、目盛、グラフのサイズなどのよく使用されるフォーマットを変更するものです。

完成するグラフは以下のようなグラフになります。

完成する図のサンプル画像を載せています。

サンプルプログラム

サンプルプログラムを以下に示します。

Sub アクティブチャートの散布図の書式変更()
    Dim mm_to_pt As Double
    Dim TargetChart As Chart
    
    mm_to_pt = 2.8346457 ' 単位 pt を mm に変更する
    
    ' グラフの横幅と縦幅
    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
            ' 表示位置の設定
            .Left = graphWidth * 0.13
            .Top = graphHeight * 0.09
            ' サイズを変更
            .Width = 120
            ' 枠線を追加
            .Border.Color = RGB(0, 0, 0)
            ' 背景色を白に設定
            .Format.Fill.ForeColor.RGB = RGB(255, 255, 255)
            ' 影の設定
            With .Format.Shadow
                .Visible = True
                ' ぼやけ度合を変更
                .Blur = 0
            End With
            ' フォントの設定
            With .Font
                .Name = "Times New Roman"
                .Size = 9
                .Bold = False
            End With
        End With
        
        ' X軸
        With TargetChart.Axes(xlCategory, xlPrimary)
            ' 軸ラベルを表示
            .HasTitle = True
            '.AxisTitle.Text = "横軸 (単位)"
            ' メジャー目盛線を非表示
            .MajorGridlines.Delete
            ' マイナー目盛線を非表示
            .MinorGridlines.Delete
            ' 軸の色を黒に設定
            .Border.Color = RGB(0, 0, 0)
            ' 軸の目盛を内向きに表示
            .MajorTickMark = xlTickMarkInside
            .MinorTickMark = xlTickMarkInside
            ' 数値軸のフォントを変更
            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
            '.AxisTitle.Text = "縦軸 (単位)"
            ' メジャー目盛線を非表示
            .MajorGridlines.Delete
            ' マイナー目盛線を非表示
            .MinorGridlines.Delete
            ' 軸の色を黒に設定
            .Border.Color = RGB(0, 0, 0)
            ' 軸の目盛を内向きに表示
            .MajorTickMark = xlTickMarkInside
            .MinorTickMark = xlTickMarkInside
            ' 数値軸のフォントを変更
            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(0, 0, 0)     ' 色を黒に設定
            .Border.Weight = 1.5             ' 太さを1.5ptに設定
            ' サイズの変更
            .Width = graphWidth * 0.92
            .Height = graphHeight * 0.88
            ' 位置の変更
            .Left = graphWidth * 0.05
            .Top = graphHeight * 0.03
        End With
        
        ' pngで保存
        ' TargetChart.Export "./Chart.png", "PNG"
    Else
        MsgBox "グラフが選択されていません"
    End If
End Sub

各行の意味はコメントとして記述している通りですので、それ以外の部分について補足いたします。

    graphWidth = 150 * mm_to_pt
    graphHeight = 100 * mm_to_pt

は、グラフの横幅と縦幅を決めています。数値の単位は[mm]になります。

Microsoft WordのA4サイズのレイアウトで、余白がデフォルトになっている場合に、ページ1枚に2つのグラフが張り付けられるサイズにしています。

これらの変数(graphWidth、graphHeight)に数値をかけているものは、グラフのサイズに対する割合を用いて、位置やサイズを決めています(例えば、凡例の表示位置なとがその例です)。

    If Not ActiveChart Is Nothing Then
     ...
    Else
        MsgBox "グラフが選択されていません"
    End If

の部分は、アクティブチャートが存在する場合は「...」の処理を行い、そうでない場合は「グラフが選択されていません」という警告文を出す、という意味があります。

最後にコメントアウトしている部分は、アクティブチャートをpng形式の画像でファイル出力することを意味します。

        ' pngで保存
        TargetChart.Export "./Chart.png", "PNG"

"./Chart.png"を変更すれば、保存場所とファイル名を変更できます。

使い方

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 ' 単位 pt を mm に変更する
    
    ' グラフの横幅と縦幅
    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
        ' 表示位置の設定
        .Left = graphWidth * 0.13
        .Top = graphHeight * 0.09
        ' サイズを変更
        .Width = 120
        ' 枠線を追加
        .Border.Color = RGB(0, 0, 0)
        ' 背景色を白に設定
        .Format.Fill.ForeColor.RGB = RGB(255, 255, 255)
        ' 影の設定
        With .Format.Shadow
            .Visible = True
            ' ぼやけ度合を変更
            .Blur = 0
        End With
        ' フォントの設定
        With .Font
            .Name = "Times New Roman"
            .Size = 9
            .Bold = False
        End With
    End With
    
    ' X軸
    With TargetChart.Axes(xlCategory, xlPrimary)
        ' 軸ラベルを表示
        .HasTitle = True
        '.AxisTitle.Text = "横軸 (単位)"
        ' メジャー目盛線を非表示
        .MajorGridlines.Delete
        ' マイナー目盛線を非表示
        .MinorGridlines.Delete
        ' 軸の色を黒に設定
        .Border.Color = RGB(0, 0, 0)
        ' 軸の目盛を内向きに表示
        .MajorTickMark = xlTickMarkInside
        .MinorTickMark = xlTickMarkInside
        ' 数値軸のフォントを変更
        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
        '.AxisTitle.Text = "縦軸 (単位)"
        ' メジャー目盛線を非表示
        .MajorGridlines.Delete
        ' マイナー目盛線を非表示
        .MinorGridlines.Delete
        ' 軸の色を黒に設定
        .Border.Color = RGB(0, 0, 0)
        ' 軸の目盛を内向きに表示
        .MajorTickMark = xlTickMarkInside
        .MinorTickMark = xlTickMarkInside
        ' 数値軸のフォントを変更
        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(0, 0, 0)     ' 色を黒に設定
        .Border.Weight = 1.5             ' 太さを1.5ptに設定
        ' サイズの変更
        .Width = graphWidth * 0.92
        .Height = graphHeight * 0.88
        ' 位置の変更
        .Left = graphWidth * 0.05
        .Top = graphHeight * 0.03
    End With

End Sub

アクティブチャートがある場合は、前の処理と同じです。アクティブチャートがない場合には、

    For Each ChartObj In Selection
        ChartObj.Activate
         
        Set TargetChart = ActiveChar
        Call changeFormat(TargetChart)
    Next

で、選択したもの(Selection)からチャートを取り出し、それをアクティブシートにして、前の処理と同じことを行います。

処理の共通部分は、changeFormatという名前のサブルーチンとしてまとめました。

使い方

Excelの「開発」メニューから「Visual Basic」を選択すると、VBAが開きます。

プロジェクトの中のツリーからVBAコードを追加したいブックを選択し、右クリックします。

そして、「挿入」の中から「標準モジュール」をクリックすれば、標準モジュールがプロジェクトに追加されますので、その中にコードをコピーします。

Excelに戻って、通常とおりグラフを作成します。

具体的には、データを範囲選択して、「挿入」メニューのグラフから散布図を選択します。それにより、散布図のグラフが作成されます。

この作成されたグラフはフォーマットが初期(デフォルト)のものになっています。

グラフが1つの場合には、このグラフを左クリックして、「開発」メニューの「マクロ」から先ほどコピーしたコードを実行します。

グラフが複数の場合には、Ctrlキーを押しながら複数のグラフを左クリックして選択状態にし、「開発」メニューの「マクロ」から先ほどコピーしたコードを実行します。

これにより、フォーマットが適用されてグラフの見栄えが整えられます。

まとめ

Excelファイルの散布図のフォーマットを指定するVBAのサンプルプログラムをご紹介しました。

このサンプルプログラムを一から書くと面倒ですが、一度作成しておけば修正は簡単です。

ご参考になりましたら幸いです。

-TECHNOLOGY
-,