【Excel-VBA#9】グラフテンプレートかなり便利です
1. はじめに
Excelのグラフテンプレート機能はご存知でしょうか? 非常に便利な機能ですが周りの人に聞いても意外と知らない人が多かったので紹介しようと思います。特にVBAでデータ処理&グラフ化する際に知ってるとかなり強力なツールです。
2. グラフテンプレート機能とは
簡単に言うと、手作業で作ったグラフレイアウトをテンプレートとして保存しておくと、2回目以降はテンプレートを読み込むだけでレイアウトを適用できる機能です。
例えば以下のデータをグラフ化したい場合、普通に散布図を選ぶと以下のようなグラフができます。
このままでは論文等に載せることはできないので、大抵は以下のようにレイアウトを変更します。例えばラベルを付けたり、マーカーを白黒にしたり、英数字のフォントをArialにします。
これをグラフテンプレート化します。グラフの上で右クリックして、「テンプレートとして保存」をクリックします。
すると以下のように保存先が現れるので今回は「テスト」という名前で保存します。
※個人情報のため一部黒塗りにしています
次にこのテンプレートを適用してみましょう。先ほど作ったグラフは消して新たにグラフを作ります。
グラフを右クリックして「グラフの種類の変更」をクリックします。
そうすると以下のウインドが開くので、テンプレートから先ほど保存した「テスト」を選択します。※個人情報のため一部黒塗りにしています
そうするとこんな感じで先ほど作ったレイアウトがすぐに適用されます。
3. コードの説明
先ほど紹介したグラフテンプレートをVBAで呼び出す方法を紹介します。その前にまず失敗例から紹介します。
3.1 失敗例:VBAでグラフ化する時にやりがちな方法
私が過去にVBAでグラフ作成を自動化した際に、やってしまっていた失敗例です。コーディングの時間に比べて得られるメリットが少ないので今回失敗例としています。
例えばこれまで以下のようなプログラムを書いていました。
'①散布図の作成-----------------------------
Dim ch As Chart
Set ch = ActiveSheet.ChartObjects.Add(450, 250, 400, 300).Chart '図の位置と大きさ
ch.ChartType = xlXYScatter '散布図を設定
'②系列1のデータを設定
ch.SetSourceData Source:=Union(Range(Cells(2, 5), Cells(EndTime, 5)), Range(Cells(2, 7), Cells(EndTime, 7)))
'③系列2のデータの設定
With ch.SeriesCollection.NewSeries '新しい系列を作成
.XValues = Range(Cells(2, 5), Cells(EndTime, 5)) '系列2のx軸データを設定
.Values = Range(Cells(2, 6), Cells(EndTime, 6)) '系列2のy軸データを設定
.AxisGroup = xlSecondary '2軸に設定
End With
'④グラフのレイアウトの設定
With ActiveSheet.ChartObjects(1).Chart
.HasTitle = True 'タイトルを表示
.ChartTitle.Text = "タイトル"
.Axes(xlValue, 1).HasTitle = True '縦軸ラベルを表示
.Axes(xlValue, 1).AxisTitle.Text = "Temperature / K"
.Axes(xlCategory, 1).HasTitle = True '横軸ラベルを表示
.Axes(xlCategory, 1).AxisTitle.Text = "Time / s"
End With
'--------------------------------
①~③までは良いのですが、④のようにグラフタイトルや軸ラベルまでコーディングしていました。ここから更にマーカーの種類・色・大きさ、軸の幅などを設定すると更にコードが長くなっていき可読性も悪くなっていきます。
3.2 おすすめ方法:グラフテンプレート機能を使う
'①散布図の作成-----------------------------
Dim ch As Chart
Set ch = ActiveSheet.ChartObjects.Add(450, 250, 400, 300).Chart '図の位置と大きさ
ch.ChartType = xlXYScatter '散布図を設定
'②系列1のデータを設定
ch.SetSourceData Source:=Union(Range(Cells(2, 5), Cells(EndTime, 5)), Range(Cells(2, 7), Cells(EndTime, 7)))
'③系列2のデータを設定
With ch.SeriesCollection.NewSeries '新しい系列を作成
.XValues = Range(Cells(2, 5), Cells(EndTime, 5)) '系列2のx軸データを設定
.Values = Range(Cells(2, 6), Cells(EndTime, 6)) '系列2のy軸データを設定
.AxisGroup = xlSecondary '2軸に設定
End With
'④グラフテンプレート機能で事前に保存されているデザインを読み込む
ch.ApplyChartTemplate ( _
"C:\Users\(ユーザー名)\AppData\Roaming\Microsoft\Templates\Charts\テスト.crtx" _
)
'--------------------------------
①~③まで一緒です。④で事前に保存しておいたグラフテンプレート機能を呼び出しています。例えば今回は先ほど「テスト」という名前で保存したグラフテンプレートを読み込んでいます。"C:\Users\(ユーザー名)\AppData\Roaming\Microsoft\Templates\Charts\(テンプレート名).crtx"の(ユーザー名)と(テンプレート名)を修正してお使いください。
例:例えばPC名がTanaka Taroでグラフテンプレートを株価で保存した場合、"C:\Users\Tanaka Taro\AppData\Roaming\Microsoft\Templates\Charts\株価.crtx" と修正して使ってください。
4. おすすめの参考書
個人的にいくつかExcel-VBAの参考書を読みましたが、以下の参考書がよかったです。