エクセルでグラフを作る際に、まず面倒くさいのはデータの選択ではないでしょうか?
もちろん、CtrlやShiftボタンを使えばそれなりに効率的にデータ範囲を選択できますが、グラフが変なところに表示されたり、色々面倒くさい感じがします。どうせグラフの見た目も整えるのであれば、データ選択もマクロでやってしまった方が早いですよね。
どのようにすれば効率的でしょうか?
第1回目は1列目にX軸、そのあとの列にY軸が並ぶデータのグラフをマクロを用いて作成しました。しかし、このデータ形式については手作業でグラフを作ってもさほど大変ではありません。今回は、よくある別のデータの並び方について、マクロを用いてグラフを作ってみます。
X軸とY軸が交互に並ぶデータ
今回扱うのはX軸とY軸が交互に並ぶようなデータです。実際によく扱うのではないでしょうか?見た目としては下図のようになります。

何も考えずにこのデータを選択し、散布図を作ると、X軸1をX軸として、そのあとの列すべてをY軸にするグラフができてしまいます。このようなデータがあった際に、下図のようにデータの一番上の行を選択するだけでグラフを作れるマクロがあれば便利ではないでしょうか?今回扱うのはそのようなマクロになります。

実際のマクロコード
早速ですが、以下のようなコードを使えば、X軸とY軸が並んだデータのグラフを作ることができます。このまま使ってもいいですし、以下に解説を書くので、自分で改造して使いやすいマクロにしてもいいでしょう。
Sub DataSelect3()
Dim cn As Integer
Dim Rng As Variant
Dim Rng_X As Range
Dim Rng_Y As Range
Dim Graphname As String
Dim graph As Chart
'選択範囲の列数を取得
cn = Selection.Cells.Columns.Count
'選択範囲のアドレスを取得
Rng = Split(Selection.Cells.Address(False, False), ":")
'まず最初の2列のグラフを作る
Range(Rng(0)).Select
Set Rng_X = Range(Selection, Selection.End(xlDown)) 'X軸データとして選択
Range(Rng(0)).Offset(0, 1).Select '隣の列を選択
Set Rng_Y = Range(Selection, Selection.End(xlDown)) 'Y軸データとして選択
Set graph = ActiveSheet.Shapes.AddChart.Chart 'グラフを作ります
With graph
.ChartType = xlXYScatterLinesNoMarkers
.SetSourceData Range(Rng_X, Rng_Y) 'ここでX軸、Y軸のデータを指定
Graphname = .Parent.Name '作ったグラフの名前を取得
End With
'ここから先は、上記のグラフに残りのデータを追加します。
For n = 1 To cn / 2 - 1
Range(Rng(0)).Offset(0, 2 * n).Select
Set Rng_X = Range(Selection, Selection.End(xlDown))
Range(Rng(0)).Offset(0, 2 * n + 1).Select
Set Rng_Y = Range(Selection, Selection.End(xlDown))
With ActiveSheet.ChartObjects(Graphname).Chart.SeriesCollection.NewSeries
.XValues = Rng_X
.Values = Rng_Y
End With
Next n
End Sub
選択範囲のアドレスを取得する
データの一番上の行を選択したとして、そこからどのような情報を得ればグラフが作れるでしょうか?最初の列とデータがいくつあるかが分かればいいでしょう。
'選択範囲の列数を取得
cn = Selection.Cells.Columns.Count
'選択範囲のアドレスを取得
Rng = Split(Selection.Cells.Address(False, False), ":")
マクロの上記の部分がその情報を得ている部分です。Selection.Cells.Columns.Countで選択している範囲の列数を返します。
一方で、アドレスの方はちょっと複雑で、Selection.Cells.Address(False, False)が選択範囲のアドレスを返し、(このFalse,Falseの指定では)”B3:G3“です。今知りたいのは最初の列、つまりB3だけなので、Split関数を用いて文字列を”:“で分割しているわけです。
まず最初にグラフを作る
これで最初の列とデータがいくつかあるか分かったので、後はグラフを作るだけです。ここでは最初の2列(X軸1とY軸1)でグラフを作り、そのあとに他のデータを追加するやり方をしています。
もしかするといっぺんにグラフを作成する方法があるのかもしれませんが、私には見つけられませんでした。
Range(Rng(0)).Select
Set Rng_X = Range(Selection, Selection.End(xlDown)) 'X軸データとして選択
Range(Rng(0)).Offset(0, 1).Select '隣の列を選択
Set Rng_Y = Range(Selection, Selection.End(xlDown)) 'Y軸データとして選択
Set graph = ActiveSheet.Shapes.AddChart.Chart 'グラフを作ります
With graph
.ChartType = xlXYScatterLinesNoMarkers
.SetSourceData Range(Rng_X, Rng_Y) 'ここでX軸、Y軸のデータを指定
Graphname = .Parent.Name '作ったグラフの名前を取得
End With
まず、先ほどRngにアドレスを:で分割した文字列が入っているので、Rng(0)=B3, Rng(1)=G3となります。B3を選択して下方向終端までが1つ目のX軸なのでRng(0)を選択した後に
Set Rng_X = Range(Selection, Selection.End(xlDown))
とすることでRng_XにX軸データが選択されます。
一方で、対応するY軸は一つ右側の列にいるので、オフセットを使って、C3を選んで同じことをすればOKです。
最後にグラフを作りますが、ポイントはGraphname = .Parent.Name で作ったグラフオブジェクトの名前を取得していることです。この名前を用いて他のデータを追加しています。.Parentを使うことでチャートではなくグラフオブジェクトの名前を取得していることがポイントです。
残りのデータを追加
あとは残りのデータを追加していくわけですが、それほど難しくはないでしょう。全列数は既にcnに取得しているわけですから、この数字を使えば1つ目と同じように追加できます。先程作ったグラフオブジェクトの名前を使って追加します。
'ここから先は、上記のグラフに残りのデータを追加します。
For n = 1 To cn / 2 - 1
Range(Rng(0)).Offset(0, 2 * n).Select
Set Rng_X = Range(Selection, Selection.End(xlDown))
Range(Rng(0)).Offset(0, 2 * n + 1).Select
Set Rng_Y = Range(Selection, Selection.End(xlDown))
With ActiveSheet.ChartObjects(Graphname).Chart.SeriesCollection.NewSeries
.XValues = Rng_X
.Values = Rng_Y
End With
Next n
出来上がったグラフ
最初のに見せたデータにマクロを使うと下図のようなグラフになりました。

グラフの見た目が気に入らないという方は、以前紹介したそれっぽいグラフの見た目にするマクロを使えばできます。
今回作成したコードの最後(Next nとEnd Subの間)に以下のようなコードを書き加えれば、グラフの見た目も整うはずです。
With graph
'グラフタイトルを消す
.HasTitle = False
'枠線を黒く
.PlotArea.Format.Line.ForeColor.RGB = RGB(0, 0, 0)
'凡例を消す
.HasLegend = False
'X軸
With .Axes(xlCategory)
'軸の色
.Format.Line.ForeColor.RGB = RGB(0, 0, 0)
'軸ラベルの有無
.HasTitle = True
.AxisTitle.Text = "X-axis"
'軸ラベルの書式
.AxisTitle.Font.Size = 14
.AxisTitle.Font.Name = "Arial"
'目盛り内向き
.MajorTickMark = xlInside
'グリッド線を消す
.MajorGridlines.Format.Line.Visible = msoFalse
'目盛りの書式
.TickLabels.Font.Name = "Arial"
.TickLabels.Font.Size = 10
End With
'Y軸
With .Axes(xlValue)
.Format.Line.ForeColor.RGB = RGB(0, 0, 0)
.HasTitle = True
.AxisTitle.Text = "Y-axis"
.AxisTitle.Font.Size = 14
.AxisTitle.Font.Name = "Arial"
.MajorTickMark = xlInside
.MajorGridlines.Format.Line.Visible = msoFalse
.TickLabels.Font.Name = "Arial"
.TickLabels.Font.Size = 10
End With
End With
まとめ
前回に比べ、より実際に役に立ちそうなデータ選択・グラフ作成マクロだったのではないでしょうか?データの選択方法はまだまだいろいろななパターンがあると思います。次回以降もそれらを紹介し、最終的には単一のマクロで場合分けまでできるマクロを紹介したいと思っています。
では




コメント