データを視覚的に解析するために効果的なグラフですが、データの種類が多くなると作成するグラフも多くなり、非常に手間がかかります。グラフの作成を自動化したいけど、やり方がわからない方、この記事ではグラフの作成をVBAで自動化する方法について紹介しますので参考にしてください。
サンプルコード
この記事では、下のサンプルデータを利用して
こんな感じのグラフを作成します。
グラフ作成コード
Sub Make_Graph()
Dim wsn As String: wsn = ActiveSheet.Name
Dim xr As Range'日付データ
Dim yr As Range'気温データ
Dim dtname As String: dtname = Cells(2, 3)'データの名称
Dim chartObj As ChartObject
Dim ch As Long: ch = 1
Dim grp As String: grp = "散布図グラフ"
Dim grptitle As String: grptitle = "東京の気温"
Dim cellcolor As Long'マーカーの色
Dim r As Long
Dim g As Long
Dim b As Long
'/グラフの色を取得/
cellcolor = Cells(2, 3).Interior.Color
r = cellcolor Mod 256
g = Int(cellcolor / 256) Mod 256
b = Int(cellcolor / 256 / 256) Mod 256
'/Chartオブジェクトの作成/
With Worksheets(wsn)
Set chartObj = .ChartObjects.Add(380, 20, 600, 300)
.ChartObjects(ch).Name = grp
End With
'/データの格納/
Set xr = Range(Cells(3, 2), Cells(3, 2).End(xlDown))
Set yr = Range(Cells(3, 3), Cells(3, 3).End(xlDown))
'/グラフの設定/
With Worksheets(wsn).ChartObjects(grp).Chart
.ChartType = xlXYScatter
.ChartWizard , , , , , , True, Title:=grptitle, valuetitle:="気温(℃)"
With .PlotArea.Format.Line
.Visible = msoTrue
.ForeColor.RGB = RGB(0, 0, 0)
.Weight = 1
End With
With .Axes(xlValue)
.MajorTickMark = xlInside
.TickLabelPosition = xlLow
.TickLabels.NumberFormatLocal = "#0_ "
.MinimumScale = 0
.MaximumScale = 40
End With
With .Axes(xlCategory)
.TickLabelPosition = xlLow
.TickLabels.NumberFormatLocal = "yyyy/m/d"
.MinimumScale = DateSerial(2017, 1, 1)
.MaximumScale = DateSerial(2020, 1, 1)
.MajorUnit = 182.5
End With
With .SeriesCollection.NewSeries
.XValues = xr
.Values = yr
.MarkerForegroundColor = RGB(r, g, b)
.MarkerBackgroundColor = RGB(r, g, b)
.Border.Color = RGB(r, g, b)
.MarkerStyle = xlMarkerStyleDiamond
.MarkerSize = 5
.Name = dtname
End With
End With
End Sub
簡単な説明
グラフの作成は次の流れに沿って行います。
1.Chartオブジェクト(グラフ)の作成
2.グラフ種類・タイトルの設定
3.プロットエリアの外枠の設定
4.グラフ縦軸の設定
5.グラフ横軸の設定
6.データの登録
Chartオブジェクト(グラフ)の作成
まずは、グラフの器を作成します(下の図の赤枠の部分)。これに色々な設定を行いグラフを完成させます。
chartオブジェクトの作成は、この部分で行っています。
With Worksheets(wsn)
Set chartObj = .ChartObjects.Add(380, 20, 600, 300)
.ChartObjects(ch).Name = grp
End With
ここでは、chartオブジェクトの追加と名称を設定しています。
.ChartObjects.Addでは、(左位置、上位置、幅、高さ)を設定しています。なくても問題ないですが、予めグラフの作成位置を決めておいた方が後から調整する手間が省けます。
なお、変数wsnおよびgrpは宣言時にそれぞれシート名とオブジェクト名を取得しています。
Dim wsn As String: wsn = ActiveSheet.Name
Dim grp As String: grp = “散布図グラフ”
グラフ種類・タイトルの設定
With Worksheets(wsn).ChartObjects(grp).Chart
.ChartType = xlXYScatter ‘グラフ種類
.ChartWizard , , , , , , True, Title:=grptitle, valuetitle:=”気温(℃)”
~省略~
End with
次にchartTypeでグラフの種類を設定し、ChartWizardでグラフタイトルと縦軸のラベルを設定しています。
プロットエリアの外枠の設定
With .PlotArea.Format.Line
.Visible = msoTrue
.ForeColor.RGB = RGB(0, 0, 0)
.Weight = 1
End With
.Visibleで枠の有無、.ForeColor.RGBで枠色、.Weightで線の太さを設定します。
グラフ縦軸の設定
With .Axes(xlValue)
.MajorTickMark = xlInside
.TickLabelPosition = xlLow
.TickLabels.NumberFormatLocal = “#0_ “
.MinimumScale = 0
.MaximumScale = 40
End With
.MajorTickMarkはメモリの向きを設定します。サンプルでは内側に向かうようにしています。 .TickLabelPositionは軸の位置、 .TickLabels.NumberFormatLocalは書式設定になります。
軸の最小を.MinimumScale、最大を.MaximumScaleで設定します。軸間隔は省略しています。
グラフ横軸の設定
With .Axes(xlCategory)
.TickLabelPosition = xlLow
.TickLabels.NumberFormatLocal = “yyyy/m/d”
.MinimumScale = DateSerial(2017, 1, 1)
.MaximumScale = DateSerial(2020, 1, 1)
.MajorUnit = 182.5
End With
横軸の設定では、.TickLabels.NumberFormatLocalで書式を日付形式にしています。
軸の最小値・最大値はDateSerial関数を用いて日付からシリアル値に変換しています。関数を使用した方がシリアル値で直接入力するよりも直感的にわかり易いです。
軸間隔は、大体半年の182.5日となるようにしています。
データの登録
最後にデータの登録です。
事前準備として
Set xr = Range(Cells(3, 2), Cells(3, 2).End(xlDown))
Set yr = Range(Cells(3, 3), Cells(3, 3).End(xlDown))
この部分でRange型の変数xr、yrにデータを格納しています。
また、マーカーの色を取得するために次の処理を行っています。
cellcolor = Cells(2, 3).Interior.Color
r = cellcolor Mod 256
g = Int(cellcolor / 256) Mod 256
b = Int(cellcolor / 256 / 256) Mod 256
変数cellcolorへ、指定したセル色の値を取得します。この値をRGB関数に渡すために変数r,g,bへそれぞれ値を割り振っています。
セル色の取得に関する内容は、↓の記事も参考にしてください。
そして最後に、下記の部分でchartオブジェクトへデータを登録します。
With .SeriesCollection.NewSeries
.XValues = xr
.Values = yr
.MarkerForegroundColor = RGB(r, g, b)
.MarkerBackgroundColor = RGB(r, g, b)
.Border.Color = RGB(r, g, b)
.MarkerStyle = xlMarkerStyleDiamond
.MarkerSize = 5
.Name = dtname
End With
MarkerStyle はマーカーの形状、.MarkerSize は大きさ、.Nameはデータセットの名称です。
コメント