Excelグラフにタイトル、凡例、データラベルを表示するVBA/マクロ便利Tips

業務効率化に役立つVBA/マクロのさまざまなTipsをコード例を交えて紹介していきます。今回は、グラフにタイトルを指定するChartTitle.Text、凡例の位置を指定するLegend.Position、凡例の背景を塗りつぶす色を指定するLegend.Format.Fill.ForeColor.RGB、データラベルを表示/非表示にするHasDataLabelsプロパティなどについて

» 2014年09月30日 18時00分 公開
[薬師寺国安PROJECT KySS]
「VBA/マクロ便利Tips」のインデックス

連載目次

※本Tipsの環境:Windows 8.1 Enterprise(64ビット)+Excel 2013


グラフをカスタマイズして見やすくし、高い訴求力を

 今回は、グラフのタイトルや凡例、データラベルに関するTipsを紹介する。グラフにこれらを表示するだけで、より見やすい資料になるのではないだろうか。

 しかしタイトルも凡例も、データを選択してグラフを作成すると、タイトルになりそうな文字列があれば自動的にそれがタイトルとして表示され、凡例も自動的に作成される。凡例として表示されるべき項目があった場合に凡例も自動的に表示される。

 そのため、タイトルや「凡例の位置」が表示されることもある。そこで、自分でタイトルや「凡例の位置」を設定する方法を見ていこう。

 またグラフのデータラベルも、グラフを表示させる場合には結構利用されると思う。実際のデータの値をグラフ上に直接表示させるわけだから、グラフが見やすくなり訴求力も増してくるはずだ。

 データラベルはExcelからでもグラフに容易に表示できる。グラフ自体を選択して、マウスの右クリックで表示される「データラベルの表示」を選択すると、グラフ上にデータラベルが表示される。

 しかし、グラフをマクロで自動的に作成するのなら、やはりデータラベルも同じように表示させる方がより自動化されたものになるのではないだろうか。知っておいて損のないTipsだと思う。

グラフにタイトルを指定するChartTitle.Textプロパティ

 まず、グラフにタイトルを入れる方法について解説する。図1のようなタイトルの設定されたグラフと「タイトルを入力」セルと「実行」というボタンがあったとしよう。

図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
リスト1 指定したタイトルをグラフに適用するコード

 まず、3行目でChartObjectオブジェクトのコレクションであるChartObjects(1)のHasTitleプロパティでグラフにタイトルを表示させるよう指定する。

 4行目で「タイトル入力」のセルが未入力かどうか判定し、未入力の場合は警告メッセージを出して処理を抜ける。それ以外は8行目の処理を行う。

 8行目では、ChartObjects(1)のグラフのChartTitleのTextプロパティに「F2」のセルに入力された値を指定する。これで、ワークシート上のアクティブシートに表示されている1個のグラフのタイトルが指定される。

 このマクロを図1の「実行」ボタンに関連付け実行すると、図2のように表示される。セル「F2」に入力した値がタイトルとして表示される。

図2 タイトルが、指定したタイトルに変更された

グラフの凡例の位置を指定するLegend.Positionプロパティ

 次に、グラフの凡例の位置を指定するTipsを紹介する。図2の任意の場所に「凡例の位置実行」というボタンを配置しておこう。

 書式は下記の通りだ。

グラフの凡例の位置を指定する書式

ActiveSheet.ChartObjects(1).Chart.HasLegend=True

ActiveSheet.ChartObjects(1).Chart.Legend.Position={表1の値}


 ChartObjectsや「1」については、先ほどと同様なので割愛する。

 ここでは、ChartObjectオブジェクトのコレクションであるChartObjectsのインデックスに対応するグラフのHasLegendプロパティにTrueを指定して、グラフに凡例を表示させるよう指定する。

 次に、LegendオブジェクトのPositionプロパティに、{表1の値}を指定する。

表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
リスト2 凡例の位置を表示するコード

 HasLegendプロパティにTrueを指定して、凡例を表示するように指定する。LegendオブジェクトのPositionプロパティに、ここではグラフの左に凡例を表示するよう、「xlLegendPositionLeft」と指定した。

 リスト2のマクロを、図2の「凡例の位置実行」ボタンに関連付け実行すると、図3のように凡例が指定した位置に表示される。

図3 凡例が指定した位置(この場合左側)に表示された

 図2と比べると、図3のグラフに凡例が挿入されているのが分かるだろう。

 今回のデータでは、特に凡例として表示されるべき項目がなかったため、「■5月売上金額」とだけ表示された。凡例として表示されるべき項目があった場合には、本来は自動的に凡例が表示される。

 作成したデータによっては凡例が不要で表示が必要ない場合もある。今回は無理に凡例を追加したため、図3のような凡例になった。凡例の表示方法が理解できればいいので、これで良しとしよう。

凡例の背景を塗りつぶす色を指定するLegend.Format.Fill.ForeColor.RGBプロパティ

 続いて、凡例の背景を塗りつぶす色を指定するTipsについて解説する。

 図4のような生徒別の各科目の点数のデータがあり、そのグラフが凡例と共に表示されているとしよう。図4にはいつもの手順で配置した「凡例の背景色を設定」というボタンが配置されている。

図4 生徒別の各科目の点数のデータがあり、そのグラフが凡例と共に表示されている。「凡例の背景色を設定」というボタンも配置されている

コラム「凡例項目の“横”と“縦”を変えるには」

 図4の凡例を見ると「氏名」が凡例項目に指定されている。直接VBAとは関係ないが、「凡例項目」を「科目」に指定したい場合、以下の手順を踏むといい。

 まずグラフの凡例を選択して、マウスの右クリックで表示されるメニューから[データの選択]を選択する。すると、図5の画面が表示される。

図5 データの選択画面で[行/列の切り替えを]クリックする

 図5の上下を見比べると凡例の項目が入れ替わっているのが分かる。実際には、図6のように表示され指定した通りに凡例が表示された。

図6 図4と凡例が入れ替わって表示されている

凡例の背景を塗りつぶす色を指定する書式

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の値を入力できるセルを用意しておこう。

図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
リスト3 「凡例の背景を塗りつぶす」コード

 7行目では、凡例の背景を塗りつぶすためにLegend.Format.Fill.Visibleプロパティに「msoTrue」と指定している。8行目では、ForeColorオブジェクトのRGBプロパティにRGB関数で変換した色を指定する。変換した色は図7に用意したR、G、Bのセルに入力した値となる。あらかじめ3〜6行目では、ここに値が入力されていないと警告メッセージが表示されるようにしている。

 このマクロを図4の「凡例の背景色を設定」ボタンに関連付け実行すると、図8のように表示される。「凡例の背景色」が塗りつぶされる。ここでは「黄色」で塗りつぶした。

図8 凡例の背景色が黄色で塗りつぶされた

グラフにデータラベルを表示/非表示にするHasDataLabelsプロパティ

 最後に、グラフにデータラベルを表示するについて解説する。

 記事「プレゼン/会議資料に生かす、Excelグラフの基本的な作り方」でもグラフにデータラベルを表示させる方法は解説しているが、今回はそれとは異なった方法でデータラベルを表示する。ぜひ、多くの方法を身に付けていただきたい。

グラフにデータラベルを表示する書式

{オブジェクト}.HasDataLabels=True


 {オブジェクト}には、Seriesオブジェクトを指定する。Seriesオブジェクトとはグラフのデータ系列を表すオブジェクトだ。SeriesオブジェクトのHasDataLabelsプロパティにTrueを指定することでデータラベルを表示できる。

 図8の適当な位置に「データラベル表示」と「データラベル非表示」という2つのボタンを用意しておこう(図9)。

図9 「データラベル表示」と「データラベル非表示」という2つのボタンを配置する

 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
リスト4 データラベルを表示するコード

 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
リスト5 データラベルを非表示にするコード

 解説はリスト4と同じであるため省略する。HasDataLabelsプロパティにFalseを指定するだけだ。

 実行すると、図10のようにデータラベルがグラフ上に表示される。「データラベルの非表示」ボタンクリックでデータラベルを非表示にできる。

図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.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。