人に結果を説明するためにレポートや報告書にグラフを貼り付けることはよくあります。
このようなグラフを含む資料を作成する場合には、グラフのサイズや書式などの見た目(フォーマット)を整えた方が見栄えがよくなります。
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のサンプルプログラムをご紹介しました。
このサンプルプログラムを一から書くと面倒ですが、一度作成しておけば修正は簡単です。
ご参考になりましたら幸いです。