Excelグラフで特定のデータを目立たせるテクニック:VBA/マクロ便利Tips
業務効率化に役立つVBA/マクロのさまざまなTipsをコード例を交えて紹介していきます。今回は、特定のデータのグラフを指定するChart.SeriesCollectionメソッド、円グラフの一部を指定するPointsメソッドなどの使い方を紹介する。
グラフで注目させたいデータを強調させよう
今回は「特定のデータのグラフにデータラベルを表示する」Tipsと「円グラフの一部を指定する」Tipsを紹介する。
「特定のデータのグラフにデータラベルを表示する」Tipsでは、例えば学校成績で常に全校生徒の得点をグラフに表示していた場合、データ件数が多いとグラフが見にくい場合がある。そんな場合に見たい人物のグラフの得点だけをグラフに表示させれば便利ではないかと思う。
また「円グラフの一部を指定する」では、任意のデータの円グラフの一部を切り出して注目させたいデータを強調する方法を紹介する。
特定のデータのグラフにデータラベルを表示する
まずは、「特定のデータのグラフにデータラベルを表示する」Tipsから紹介していこう。
図1のような生徒別の各科目の点数のデータがあり、そのグラフが凡例と共に表示されているとしよう。
このグラフはExcelメニューの[挿入]→[グラフ]と選択して作成したものだ。タイトルもデフォルトのままで何も設定はしていない。
まず今回は、Excelのセル上にコントロールを配置する。Excelメニューの[開発]→[挿入]と選択して、「フォームコントロール」の中からコンボボックスを選択する(図2)。
選択したコンボボックスを任意の位置に配置しておく。
次に任意のセル(ここではP3:P7)に生徒の氏名を入力しておく。先頭は「名前を選択」としている(図3)。
絶対参照と相対参照について
次に、コンボボックスを選択してマウスの右クリックで表示されるメニューから[コントロールの書式設定]を選択する。表示される画面の「コントロール」タブ内の[入力範囲]に「氏名」を入力した「P3:P7」を指定する。
次に[リンクするセル]も、任意のセルを指定すればいいが、ここでは「O3」を指定している(図4)。
各設定範囲は「$」を含めた[行/列固定]の絶対参照になる。今回の場合、[入力範囲]は「$P$3:$P$7」と設定される。「P3:P7」(相対参照)と何が異なるのかというと、例えば計算式が入力されているセルに対して計算式のセルを「固定」してコピーするのが「絶対参照」で、コピーされたセルの位置から相対的に判断して計算式を「変更」するのが「相対参照」になるということだ。
各項目の右端に表示されているセルのアイコンをクリックして指定する。
以上を設定すると図5のように、コンボボックス内に氏名が表示され、選択した「氏名」のインデックス番号が「O3」に表示されるようになる(図5)。
コンボボックスを有効にするには、[開発]タブの[挿入]の横にある、[デザインモード]をクリックする。ここで、[デザインモード]と[実行モード]を切り替えることができる。
特定のデータのグラフを指定する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
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において、赤枠で囲った部分はExcelを操作する人間には見えない位置に配置しておく方がいいだろう。
円グラフの一部を指定するPointsメソッド
次に、今度は円グラフの一部を切り出して目立たせるテクニックを紹介する。
「円グラフの一部を切り出す」という新しいシートを追加し、データを基に、Excelのメニューから円グラフを作成しておく。「科目」を選択させるコンボボックスは先ほど紹介した方法で設定しておく。また、切り出しの量を入力するセルも用意しておく。
円グラフ自体を選択して、マウスの右クリックで表示される「データラベルの追加」を選択して(図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〜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のようにコンボボックスより選択した「科目」が切り出されて表示される。
次回以降も、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.
関連記事
- テストエビデンス取得自動化の秘技(後編):スクショをExcelに張り付けるのに役立つ4つのテクニック
システム開発におけるソフトウェアテスト(結合テスト〜システムテスト)において重要視されるエビデンス(作業記録)。前後編の2回にわたって、エビデンスとしてスクリーンショットをキャプチャし、テスト仕様書や納品書に張り付けていく作業を自動化するためのVBA/マクロのテクニックを紹介する。後編は、画像ファイルをシートに張り付け、Excel 2013のメニューからスクショを直に張り付け、画像を縮小し、指定した時間にマクロを実行する方法を解説。 - Windows TIPS:[Esc]キーによるExcel VBAの実行中断を防止する
- Windows TIPSディレクトリ > プラットフォーム別 > Office > Excel