Excelグラフで特定のデータを目立たせるテクニックVBA/マクロ便利Tips

業務効率化に役立つVBA/マクロのさまざまなTipsをコード例を交えて紹介していきます。今回は、特定のデータのグラフを指定するChart.SeriesCollectionメソッド、円グラフの一部を指定するPointsメソッドなどの使い方を紹介する。

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

連載目次

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


グラフで注目させたいデータを強調させよう

 今回は「特定のデータのグラフにデータラベルを表示する」Tipsと「円グラフの一部を指定する」Tipsを紹介する。

 「特定のデータのグラフにデータラベルを表示する」Tipsでは、例えば学校成績で常に全校生徒の得点をグラフに表示していた場合、データ件数が多いとグラフが見にくい場合がある。そんな場合に見たい人物のグラフの得点だけをグラフに表示させれば便利ではないかと思う。

 また「円グラフの一部を指定する」では、任意のデータの円グラフの一部を切り出して注目させたいデータを強調する方法を紹介する。

特定のデータのグラフにデータラベルを表示する

 まずは、「特定のデータのグラフにデータラベルを表示する」Tipsから紹介していこう。

 図1のような生徒別の各科目の点数のデータがあり、そのグラフが凡例と共に表示されているとしよう。

 このグラフはExcelメニューの[挿入]→[グラフ]と選択して作成したものだ。タイトルもデフォルトのままで何も設定はしていない。

図1 生徒別の各科目の点数のデータがあり、そのグラフが凡例と共に表示されている

 まず今回は、Excelのセル上にコントロールを配置する。Excelメニューの[開発]→[挿入]と選択して、「フォームコントロール」の中からコンボボックスを選択する(図2)。

図2 Excelメニューの[開発]→[挿入]と選択して、「フォームコントロール」の中からコンボボックスを選択

 選択したコンボボックスを任意の位置に配置しておく。

 次に任意のセル(ここではP3:P7)に生徒の氏名を入力しておく。先頭は「名前を選択」としている(図3)。

図3 任意のセルに生徒の氏名を入力しておく

絶対参照と相対参照について

 次に、コンボボックスを選択してマウスの右クリックで表示されるメニューから[コントロールの書式設定]を選択する。表示される画面の「コントロール」タブ内の[入力範囲]に「氏名」を入力した「P3:P7」を指定する。

 次に[リンクするセル]も、任意のセルを指定すればいいが、ここでは「O3」を指定している(図4)。

図4 [入力範囲][リンクするセル]を指定する

 各設定範囲は「$」を含めた[行/列固定]の絶対参照になる。今回の場合、[入力範囲]は「$P$3:$P$7」と設定される。「P3:P7」(相対参照)と何が異なるのかというと、例えば計算式が入力されているセルに対して計算式のセルを「固定」してコピーするのが「絶対参照」で、コピーされたセルの位置から相対的に判断して計算式を「変更」するのが「相対参照」になるということだ。

 各項目の右端に表示されているセルのアイコンをクリックして指定する。

 以上を設定すると図5のように、コンボボックス内に氏名が表示され、選択した「氏名」のインデックス番号が「O3」に表示されるようになる(図5)。

図5 コンボボックスに氏名が表示され、選択した氏名のインデックスがセル「O3」に表示される

 コンボボックスを有効にするには、[開発]タブの[挿入]の横にある、[デザインモード]をクリックする。ここで、[デザインモード]と[実行モード]を切り替えることができる。

特定のデータのグラフを指定するChart.SeriesCollectionメソッド

 特定のデータのグラフを指定するChart.SeriesCollectionメソッドの書式は下記のようになる

特定のデータのグラフを指定するChart.SeriesCollectionメソッドの書式

With ActiveSheet.ChartObjects(1).Chart.SeriesCollection({インデックス番号})

 .HasDataLabels = True

End With


 データラベルを表示する書式は以前のTips「グラフにデータラベルを表示/非表示にするHasDataLabelsプロパティ」で紹介したが、ここで重要なのは、Chart.SeriesCollectionメソッドだ。

 指定されたグラフ、またはグラフ種類グループにある全てのSeriesオブジェクト(グラフのデータ系列を表すオブジェクト)のコレクションを表す、SeriesCollectionメソッドに、コンボボックスより選択されたインデックス番号を指定する。この場合のインデックス番号はセル「O3」に表示されている値だ。

 では、実際にマクロを記述してみよう。まず、VBE(Visual Basic Editor)のメニューから、[挿入]→[標準モジュール]と選択する。プロジェクトにModule1が追加されるので、Module1をダブルクリックして、表示されるエディター画面内にリスト1のコードを記述する。

Option Explicit
Sub 指定した人物の得点をグラフに表示()
  Dim 番号 As Integer
  Dim i As Integer
  番号 = Range("O3").Value - 1
  For i = 1 To 4
    ActiveSheet.ChartObjects(1).Chart.SeriesCollection(i).HasDataLabels = False
  Next
On Error GoTo myError
  With ActiveSheet.ChartObjects(1).Chart.SeriesCollection(番号)
    .HasDataLabels = True
  End With
myError:
  Exit Sub
End Sub
リスト1 指定した人物の得点をグラフに表示するマクロ

 3・4行目でInteger型の変数「番号」と「i」を宣言する。5行目で、変数「番号」にはセル「O3」に入力された値から-1した値を格納する。-1しているのはコンボボックスの先頭の文字が「名前選択」で、何もしないとこれがインデックスの「1」になってしまうからだ。実際に欲しいインデックスは、「薬師寺」からになるため、このままだと「薬師寺」はインデックスが「2」になって選択した氏名と異なってしまうため、-1をしている。

 6〜8行目では、変数「i」を1から4の間、反復処理を行う。「4」は凡例に表示されている「氏名」の個数だ。反復処理の過程で、データラベルの表示を非表示にしている。いったん全てのデータラベルの表示を非表示にするのだ。この処理を書いていないと、コンボボックスから「氏名」を選択するたびに、全ての「氏名」にデータラベルが表示されてしまう。

 コンボボックスで「名前を選択」を選択するとエラーが発生するため、8行目以降でエラー処理を行っておく。ここでは、12行目でmyErrorラベルで処理を抜けるようにしている。

 9・10行目で変数「番号」に該当する人物のグラフ上に、データラベルを表示する。変数「番号」に該当する人物とは、コンボボックスから選択されセル「O3」に表示されたインデックスから「-1」したインデックスに該当する人物のことだ。

実行結果

 それでは、実行してみよう。コンボボックスを選択して、マウスの右クリックで表示されるメニューから「マクロの登録」を選択する。リスト1のマクロを関連付け実行すると、図6のようにコンボボックスで選択された人物のグラフにデータラベルが表示される。

図6 コンボボックスから選択した人物のグラフにデータラベルが表示される

 図6において、赤枠で囲った部分はExcelを操作する人間には見えない位置に配置しておく方がいいだろう。

円グラフの一部を指定するPointsメソッド

 次に、今度は円グラフの一部を切り出して目立たせるテクニックを紹介する。

 「円グラフの一部を切り出す」という新しいシートを追加し、データを基に、Excelのメニューから円グラフを作成しておく。「科目」を選択させるコンボボックスは先ほど紹介した方法で設定しておく。また、切り出しの量を入力するセルも用意しておく。

 円グラフ自体を選択して、マウスの右クリックで表示される「データラベルの追加」を選択して(図7)、円グラフに点数も表示させておく(図8)。

図7 円グラフにデータラベルを表示する

図8 科目の平均点のデータと、その円グラフと、「切り出し量」を入力するセルと「科目」を選択するコンボボックス用意しておく

 円グラフの一部を指定するPointsメソッドの書式は下記のようになる。

円グラフの一部を指定するPointsメソッドの書式

ActiveSheet.ChartObjects(1).Chart.SeriesCollection(1).Points({インデックス番号}).Explosion ={切り出す量}


 Explosionプロパティで、円グラフを{切り出す量}を設定するが、ここで重要なのはPointsメソッドだ。Pointsメソッドで{インデックス番号}を指定すると、該当データを切り出すことができる。

 この書式を基に具体的なマクロを記述しよう。先ほど追加したModule1内に、リスト2のマクロを記述する。

Sub 円グラフの一部を切り出す()
  Dim 科目インデックス As Integer
  Dim 切り出し量 As Integer
  Dim i As Integer
  If Range("O2").Value = "" Or IsNumeric(Range("O2").Value) = False Then
    MsgBox "切り出し量が不正です。"
    Exit Sub
  Else
    切り出し量 = Range("O2").Value
    科目インデックス = Range("R2").Value - 1
  End If
 
  For i = 1 To 6
    ActiveSheet.ChartObjects(1).Chart.SeriesCollection(1).Points(i).Explosion = 0
  Next
 
On Error GoTo myError
  ActiveSheet.ChartObjects(1).Chart.SeriesCollection(1).Points(科目インデックス).Explosion = 切り出し量
myError:
  Exit Sub
End Sub
リスト2 円グラフの一部を切り出すマクロ

 まず、2〜4行目でInteger型の変数「科目インデックス」「切り出し量」「i」を宣言しておく。

 5行目では、「切り出し量」を入力するセル「O2」の値が未入力であったり、数値でなかったりするかを判定している。真の場合は警告メッセージを出して処理を抜ける。数値かどうかの判断はIsNumeric関数で行っている。

 9行目では、変数「切り出し量」に、セル「O2」の値を代入する。10行目では、変数「科目インデックス」に、コンボボックスから選択されたインデックスが表示されているセル「R2」の値から-1した値を格納する。-1しているのは、先頭の文字が「科目を選択」であるからだ。

 13〜15行目では、変数「i」で1〜6の間繰り返し処理を行う。6は「科目」の数の値だ。

 最初に初期化の意味で、全ての科目のExplosionプロパティに「0」を指定して、「円の切り出し」がない状態にしておく。この記述をしていないと、コンボボックスから「科目」を選択するたびに全ての科目が切り出されていってしまい、何を切り出して目立たせたいのか分からなくなってしまう。

 コンボボックスから選択された「科目」のExplosionプロパティに、変数「切り出し量」の値を指定する。これで、コンボボックスから選択された「科目」だけが切り出される。

 17行目以降では、コンボボックスから「科目を選択」を選択するとエラーが発生するので、エラー処理を行っている。

 図8に配置したコンボボックスにリスト2のマクロを関連付け実行すると、図9のようにコンボボックスより選択した「科目」が切り出されて表示される。

図9 コンボボックスから選択した「科目」が切り出された

次回以降も、Excelグラフで特定のデータを目立たせるテクニックを紹介

 今回は「特定のデータのグラフにデータラベルを表示する」「円グラフの一部を指定する」Tipsを紹介した。前者は、氏名を特定して、その点数を確認する場合に役に立つと思う。両Tipsとも「会議の資料として、このデータが一番メインだ」という場合に、このような表示方法を取っておくと、資料としても分かりやすくなるのではないだろうか。ぜひ応用して使ってみてほしい。

 次回以降も、Excelグラフで特定のデータを目立たせるさまざまなテクニックを紹介していく。

著者プロフィール

薬師寺 国安(やくしじ くにやす) / 薬師寺国安事務所

薬師寺国安事務所代表。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)。

Microsoft MVP for Development Platforms-Windows Platform Development (Oct 2014-Sep 2015)。


Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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