業務効率化に役立つVBA/マクロのさまざまなTipsをコード例を交えて紹介していきます。今回は、グラフにタイトルを指定するChartTitle.Text、凡例の位置を指定するLegend.Position、凡例の背景を塗りつぶす色を指定するLegend.Format.Fill.ForeColor.RGB、データラベルを表示/非表示にするHasDataLabelsプロパティなどについて
今回は、グラフのタイトルや凡例、データラベルに関するTipsを紹介する。グラフにこれらを表示するだけで、より見やすい資料になるのではないだろうか。
しかしタイトルも凡例も、データを選択してグラフを作成すると、タイトルになりそうな文字列があれば自動的にそれがタイトルとして表示され、凡例も自動的に作成される。凡例として表示されるべき項目があった場合に凡例も自動的に表示される。
そのため、タイトルや「凡例の位置」が表示されることもある。そこで、自分でタイトルや「凡例の位置」を設定する方法を見ていこう。
またグラフのデータラベルも、グラフを表示させる場合には結構利用されると思う。実際のデータの値をグラフ上に直接表示させるわけだから、グラフが見やすくなり訴求力も増してくるはずだ。
データラベルはExcelからでもグラフに容易に表示できる。グラフ自体を選択して、マウスの右クリックで表示される「データラベルの表示」を選択すると、グラフ上にデータラベルが表示される。
しかし、グラフをマクロで自動的に作成するのなら、やはりデータラベルも同じように表示させる方がより自動化されたものになるのではないだろうか。知っておいて損のないTipsだと思う。
まず、グラフにタイトルを入れる方法について解説する。図1のようなタイトルの設定されたグラフと「タイトルを入力」セルと「実行」というボタンがあったとしよう。
図1のグラフに「タイトルを入力」セルに入力したタイトルを適用させてみよう。
グラフにタイトルを入れる書式は下記のようになる。
ActiveSheet.ChartObjects(1).Chart.HasTitle=True
ActiveSheet.ChartObjects(1).Chart.ChartTitle.Text=指定したタイトル
「ChartObjects」はChartObjectオブジェクトのコレクションを表す。「1」はワークシート上のアクティブシートに配置されているグラフのインデックス番号に当たる。ChartTitleオブジェクトのTextプロパティに図1のセル「F2」に入力された値を適用する。
では、この書式を用いてマクロを記述してみよう。まず、VBE(Visual Basic Editor)のメニューから[挿入]→[標準モジュール]と選択する。プロジェクトにModule1が追加されるので、Module1をダブルクリックして表示されるエディター画面内にリスト1のコードを記述する。
Option Explicit Sub タイトルを設定する() ActiveSheet.ChartObjects(1).Chart.HasTitle = True If Range("F2").Value = "" Then MsgBox "タイトルを入力してください。" Exit Sub Else ActiveSheet.ChartObjects(1).Chart.ChartTitle.Text = Range("F2").Value End If End Sub
まず、3行目でChartObjectオブジェクトのコレクションであるChartObjects(1)のHasTitleプロパティでグラフにタイトルを表示させるよう指定する。
4行目で「タイトル入力」のセルが未入力かどうか判定し、未入力の場合は警告メッセージを出して処理を抜ける。それ以外は8行目の処理を行う。
8行目では、ChartObjects(1)のグラフのChartTitleのTextプロパティに「F2」のセルに入力された値を指定する。これで、ワークシート上のアクティブシートに表示されている1個のグラフのタイトルが指定される。
このマクロを図1の「実行」ボタンに関連付け実行すると、図2のように表示される。セル「F2」に入力した値がタイトルとして表示される。
次に、グラフの凡例の位置を指定するTipsを紹介する。図2の任意の場所に「凡例の位置実行」というボタンを配置しておこう。
書式は下記の通りだ。
ActiveSheet.ChartObjects(1).Chart.HasLegend=True
ActiveSheet.ChartObjects(1).Chart.Legend.Position={表1の値}
ChartObjectsや「1」については、先ほどと同様なので割愛する。
ここでは、ChartObjectオブジェクトのコレクションであるChartObjectsのインデックスに対応するグラフのHasLegendプロパティにTrueを指定して、グラフに凡例を表示させるよう指定する。
次に、LegendオブジェクトのPositionプロパティに、{表1の値}を指定する。
値 | 説明 |
---|---|
xlLegendPositionBottom | グラフの下 |
xlLegendPositionCorner | グラフの輪郭線の右上隅 |
xlLegendPositionCustom | 任意の位置 |
xlLegendPositionLeft | グラフの左 |
xlLegendPositionRight | グラフの右 |
xlLegendPositionTop | グラフの上 |
参考XlLegendPosition列挙(Excel)- MSDN |
先ほど追加したModule1内に「凡例の位置」を表示するリスト2のコードを記述する。
Sub 凡例の位置() ActiveSheet.ChartObjects(1).Chart.HasLegend = True ActiveSheet.ChartObjects(1).Chart.Legend.Position = xlLegendPositionLeft End Sub
HasLegendプロパティにTrueを指定して、凡例を表示するように指定する。LegendオブジェクトのPositionプロパティに、ここではグラフの左に凡例を表示するよう、「xlLegendPositionLeft」と指定した。
リスト2のマクロを、図2の「凡例の位置実行」ボタンに関連付け実行すると、図3のように凡例が指定した位置に表示される。
図2と比べると、図3のグラフに凡例が挿入されているのが分かるだろう。
今回のデータでは、特に凡例として表示されるべき項目がなかったため、「■5月売上金額」とだけ表示された。凡例として表示されるべき項目があった場合には、本来は自動的に凡例が表示される。
作成したデータによっては凡例が不要で表示が必要ない場合もある。今回は無理に凡例を追加したため、図3のような凡例になった。凡例の表示方法が理解できればいいので、これで良しとしよう。
続いて、凡例の背景を塗りつぶす色を指定するTipsについて解説する。
図4のような生徒別の各科目の点数のデータがあり、そのグラフが凡例と共に表示されているとしよう。図4にはいつもの手順で配置した「凡例の背景色を設定」というボタンが配置されている。
図4の凡例を見ると「氏名」が凡例項目に指定されている。直接VBAとは関係ないが、「凡例項目」を「科目」に指定したい場合、以下の手順を踏むといい。
まずグラフの凡例を選択して、マウスの右クリックで表示されるメニューから[データの選択]を選択する。すると、図5の画面が表示される。
図5の上下を見比べると凡例の項目が入れ替わっているのが分かる。実際には、図6のように表示され指定した通りに凡例が表示された。
ActiveSheet.ChartObjects(1).Chart.Legend.Format.Fill.Visible=msoTrue
ActiveSheet.ChartObjects(1).Chart.Legend.Format.Fill.ForeColor.RGB=RGB({赤の割合},{緑の割合},{青の割合})
ChartObjectsや「1」については、これまでと同様なので割愛する。
まず凡例の背景を塗りつぶすには、Legend.Format.Fill.Visibleプロパティに「msoTrue」を指定する。次にForeColorオブジェクトのRGBプロパティにRGB関数で変換した色を指定する。
RGB関数の標準色とそれに含まれる「赤」「緑」「青」の値については、「RGB関数(Visual Basic)- MSDN」を参照してほしい。
ここでは、図7のようにR、G、Bの値を入力できるセルを用意しておこう。
では、実際にマクロを記述してみよう。
Option Explicit Sub 凡例の背景色を変える() If Range("O6").Value = "" And Range("P6").Value = "" And Range("Q6").Value = "" Then MsgBox "色の割合を入力してください。" Exit Sub Else ActiveSheet.ChartObjects(1).Chart.Legend.Format.Fill.Visible = msoTrue ActiveSheet.ChartObjects(1).Chart.Legend.Format.Fill.ForeColor.RGB = RGB(Range("O6").Value, Range("P6").Value, Range("Q6").Value) End If End Sub
7行目では、凡例の背景を塗りつぶすためにLegend.Format.Fill.Visibleプロパティに「msoTrue」と指定している。8行目では、ForeColorオブジェクトのRGBプロパティにRGB関数で変換した色を指定する。変換した色は図7に用意したR、G、Bのセルに入力した値となる。あらかじめ3〜6行目では、ここに値が入力されていないと警告メッセージが表示されるようにしている。
このマクロを図4の「凡例の背景色を設定」ボタンに関連付け実行すると、図8のように表示される。「凡例の背景色」が塗りつぶされる。ここでは「黄色」で塗りつぶした。
最後に、グラフにデータラベルを表示するについて解説する。
記事「プレゼン/会議資料に生かす、Excelグラフの基本的な作り方」でもグラフにデータラベルを表示させる方法は解説しているが、今回はそれとは異なった方法でデータラベルを表示する。ぜひ、多くの方法を身に付けていただきたい。
{オブジェクト}.HasDataLabels=True
{オブジェクト}には、Seriesオブジェクトを指定する。Seriesオブジェクトとはグラフのデータ系列を表すオブジェクトだ。SeriesオブジェクトのHasDataLabelsプロパティにTrueを指定することでデータラベルを表示できる。
図8の適当な位置に「データラベル表示」と「データラベル非表示」という2つのボタンを用意しておこう(図9)。
Module1内に「データラベルを表示する」リスト4のコードを記述する。
Sub データラベルを表示する() Dim i As Integer For i = 1 To ActiveSheet.ChartObjects(1).Chart.SeriesCollection.Count ActiveSheet.ChartObjects(1).Chart.SeriesCollection(i).HasDataLabels = True Next End Sub
2行目でInteger型変数「i」を宣言し、3〜5行目で変数「i」を1から表示されているグラフのデータ系列の個数分反復処理を行う。要は、表示されている棒グラフの数だけ反復処理を行うということだ。
SeriesCollectionオブジェクトは、指定されたグラフまたはグラフ種類グループにある全てのSeriesオブジェクトのコレクションを表す。
反復処理の過程で4行目では、変数「i」に対応するグラフのデータ系列を表すSeriesCollectionオブジェクトのHasDataLabelsプロパティにTrueを指定してデータラベルを表示している。
リスト4のマクロを図9の「データラベルの表示」ボタンに関連付け、また「データラベルの非表示」には次のリスト5のマクロを関連付ける。
Sub データラベルを非表示にする() Dim i As Integer For i = 1 To ActiveSheet.ChartObjects(1).Chart.SeriesCollection.Count ActiveSheet.ChartObjects(1).Chart.SeriesCollection(i).HasDataLabels = False Next End Sub
解説はリスト4と同じであるため省略する。HasDataLabelsプロパティにFalseを指定するだけだ。
実行すると、図10のようにデータラベルがグラフ上に表示される。「データラベルの非表示」ボタンクリックでデータラベルを非表示にできる。
タイトルを自分で指定した「タイトル名」にできるのは、便利なTipsではないかと思う。自動的に追加されるタイトルより自分で作成したデータにふさわしいタイトルを付ける方が、より分かりやすく資料として価値があるのではないだろうか。
また凡例の表示もExcel任せだ。時と場合によっては自分で任意の位置に表示させたい場合もあるだろう。そんな場合に役に立つTipsだと思う。ぜひ読者の皆さんの日常業務に利用していただきたい。
凡例の背景を塗りつぶすTipsは実際の業務に役立つかどうかはグラフ化するデータによるかもしれないが、このようなこともできることを知っておくのも損はない。
グラフにデータラベルを表示するTipsは、先にも書いていたように以前の記事でも解説しているが、今回は別な表示方法を紹介した。データラベル一つを表示させるだけでもVBAにはいろいろな方法が存在する。
筆者はできるだけ簡単な方法で実現できる方法を紹介している。結果が同じであれば、簡単な方法を身に着けることで効率良く業務に取り組めるのではないだろうか。
読者の皆さんが、このTipsを参考にアレンジして役立ててほしい。
薬師寺 国安(やくしじ くにやす) / 薬師寺国安事務所
薬師寺国安事務所代表。Visual Basicプログラミングと、マイクロソフト系の技術をテーマとした、書籍や記事の執筆を行う。
1950年生まれ。事務系のサラリーマンだった40歳から趣味でプログラミングを始め、1996年より独学でActiveXに取り組む。
1997年に薬師寺聖とコラボレーション・ユニット「PROJECT KySS」を結成。
2003年よりフリーになり、PROJECT KySSの活動に本格的に参加。.NETやRIAに関する書籍や記事を多数執筆する傍ら、受託案件のプログラミングも手掛ける。
Windows Phoneアプリ開発を経て、現在はWindowsストアアプリを多数公開中。
Microsoft MVP for Development Platforms - Client App Dev(Oct 2003-Sep 2012)。
Microsoft MVP for Development Platforms - Windows Phone Development(Oct 2012-Sep 2013)。
Microsoft MVP for Development Platforms - Client Development(Oct 2013-Sep 2014)。
Copyright © ITmedia, Inc. All Rights Reserved.