連載
» 2014年10月09日 18時00分 UPDATE

VBA/マクロ便利Tips:折れ線グラフで特定のデータを目立たせるためにマーカーを付けたり、線の太さを変えたり、滑らかにしたりする

業務効率化に役立つVBA/マクロのさまざまなTipsをコード例を交えて紹介していきます。今回は、特定のグラフを指定するChart.SeriesCollection.Itemメソッド、折れ線グラフの線の太さを設定するLine.Weightプロパティ、折れ線グラフを滑らかにするSmoothプロパティなどの使い方を紹介する。

[薬師寺国安,PROJECT KySS]
「VBA/マクロ便利Tips」のインデックス

連載目次

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


折れ線グラフの表現力を高めよう

 今回は折れ線グラフで特定のデータを目立たせるTipsを紹介する。折れ線グラフは、「棒グラフ」「円グラフ」と並び、よく使われるグラフだ。

 折れ線グラフは読んで字のごとく、「線」で表示されるグラフであるため、どの項目がどの「線」の位置に当たるか、少し分かりづらい面がある、それを解消するために、特定のデータのグラフに「マーカー」を表示すると、折れ線グラフも大変に分かりやすくなる。

 また、折れ線グラフは「線」の太さが見栄えに大きく影響する。そこで、「線」の太さを設定する方法を解説する。

 最後に、折れ線グラフに「スムージング」を設定するTipsも紹介する。折れ線グラフを作成すると、そのグラフの線は通常は直線だが、この線を滑らかな曲線に変更できる。その方法を解説しよう。

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

 図1のような折れ線グラフがあったとしよう。この折れ線グラフはExcelの[挿入]→[グラフ]を選択して作成をした。「グラフのタイトル」も直接手入力している。

ExcelVBATipsGraph9_01.png 図1 生徒別の各科目の点数のデータをグラフ化している

 これまでのTipsで解説した方法でグラフの自動作成はできるが、今回のテーマは折れ線グラフの設定をいろいろと変えることであるため、折れ線グラフはExcelメニューから作成をした。

 次にコンボボックスを配置して氏名を表示させる。選択された氏名のインデックス番号を任意のセルに表示させる方法は、Tips「特定のデータのグラフにデータラベルを表示する」を参照してほしい。

 コンボボックスを配置して各氏名を表示させると、図2のようなレイアウトになる。

ExcelVBATipsGraph9_04.png 図2 氏名選択用のコンボボックスを配置している

 特定のグラフを指定するChart.SeriesCollection.Itemメソッドの書式は下記の通りだ。

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

ActiveSheet.ChartObjects(1).Chart.SeriesCollection.Item({インデックス番号}).MarkerStyle = {プロパティ}


 Tips「特定のデータのグラフにデータラベルを表示する」とは異なり、特定のデータを指定するのに、Chart.SeriesCollection.Itemメソッドを使っている。コンボボックスと{インデックス番号}は「薬師寺(1)」「夏目(2)」「阪神(3)」「正岡(4)」となる。

 {プロパティ}については、すでに記事「MarkerStyleプロパティでマーカーを表示」でも紹介しているので、そちらを参照してほしい。

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

Sub 折れ線グラフのマーカーを設定する()
  Dim 人物インデックス As Integer
  Dim i As Integer
  人物インデックス = Range("U2").Value - 1
  For i = 1 To 4
    ActiveSheet.ChartObjects(1).Chart.SeriesCollection.Item(i).markerStyle = xlMarkerStyleNone
  Next
On Error GoTo myError
  ActiveSheet.ChartObjects(1).Chart.SeriesCollection.Item(人物インデックス).markerStyle = xlMarkerStyleSquare
 
myError:
 Exit Sub
End Sub
リスト1 折れ線グラフのマーカーを表示するコード

 まず、2・3行目でInteger型の変数「人物インデックス」「i」を宣言しておく。

 次に、4行目で変数「人物インデックス」には、セル「U2」の値から「-1」した値を指定している。なぜ「-1」しているかというと、先頭の文字が「氏名を選択」になっており、氏名とは関係がなく、次のセルに入力された氏名を「1」にする必要があるため「-1」をしている。

 変数「i」が1〜4となる間、5行目の処理を繰り返す。5行目では、折れ線グラフのMarkerStyleに、「xlMarkerStyleNone」を指定して、全ての折れ線グラフからを一度「マーカーなし」に設定して初期化している。この処理を書いていないと、氏名を選択するたびに、折れ線グラフにマーカーが表示され、最終的には全ての折れ線グラフにマーカーが表示され、氏名を選択してマーカーを表示させる意味がなくなるからだ。

 8行目以降は、コンボボックスから「氏名を選択」を選択すると、エラーが発生するためエラー処理を行っている。

 一度マーカーを初期化しておいてから、9行目で指定した人物のMarkerStyleに、ここでは「四角形のマーカー」を表示する「xlMarkerStyleSquare」を指定している。これで、選択された人物にだけ、「四角形のマーカー」が表示されることになる。

 図2に配置したコンボボックスに、リスト1のマクロを関連付け実行すると、図3のように、選択した人物にマーカーが表示される。

ExcelVBATipsGraph9_05.png 図3 コンボボックスから選択した人物に、「四角形のマーカー」が表示された

折れ線グラフの線の太さを設定するLine.Weightプロパティ

 次に、「折れ線グラフの線の太さを設定する」Tipsについて解説する。折れ線グラフの線の太さを設定するLine.Weightプロパティの書式は下記の通りだ。

折れ線グラフの線の太さを設定するLine.Weightプロパティの書式

ActiveSheet.ChartObjects(1).Chart.SeriesCollection.Item({インデックス番号}.Format.Line.Weight ={線の太さ}


 Chart.SeriesCollection.Item({インデックス番号})については省略する。{線の太さ}の値の分だけ、線は太くなる。

 新しいシートを追加し、図2をそのままコピーしておき、{線の太さ}を入力するセルを用意して、選択された人物の折れ線グラフの太さを変えてみよう。「線の太さ」を入力するセルを作成したのが図4だ。

ExcelVBATipsGraph9_02.png 図4 コンボボックスと{線の太さ}を入力するセルを用意する

 先ほど追加したModule1内に、リスト2のコードを記述する。

Option Explicit
Sub 折れ線グラフの線の太さを指定する()
  Dim 線の太さ As Integer
  Dim 人物インデックス As Integer
  線の太さ = Range("R2").Value
  If 線の太さ = 0 Then
    MsgBox "線の太さを入力してください。"
    Exit Sub
  End If
On Error GoTo myError
  人物インデックス = Range("U2").Value - 1
  ActiveSheet.ChartObjects(1).Chart.ClearToMatchStyle
  ActiveSheet.ChartObjects(1).Chart.SeriesCollection.Item(人物インデックス).Format.Line.Weight = 線の太さ
myError:
  Exit Sub
End Sub
リスト2 線の太さを指定するコード

 まず、3・4行目でInteger型の変数「線の太さ」「人物インデックス」を宣言する。5行目で、変数「線の太さ」にセル「R2」に入力された値を指定している。今回はIsNumeric関数で数値かどうかの判定は行っていないので、数値を入力する必要がある。

 6〜9行目では、変数「線の太さ」が未入力の場合は、警告メッセージを出して処理を抜けるようにしている。

 11行目では、変数「人物のインデックス」には、コンボボックスから選択されたインデックス番号が表示される、セル「U2」の値から-1した値を指定する。-1している理由はリスト1を参照してほしい。

 13行目では、SeriesCollectionのItemに、変数「人物のインデックス」を指定し、線の太さを表す、Line.Weightプロパティに、変数「線の太さ」を指定している。

 なお12行目では、指定した人物の線の太さを指定する前にClearToMatchStyleメソッドで全ての書式を一度初期化している。これをしておかないと、コンボボックスから人物名を選択するたびに、先に選択しておいた人物の折れ線グラフの太さがそのまま残ってしまい、全ての人物の折れ線グラフの太さが「線の太さ」に指定した値になってしまうからだ。

 コンボボックスを選択して、マウスの右クリックで表示されるメニューから「マクロの登録」を選択しリスト2のマクロを関連付ける。

 実行すると、図5のようにコンボボックスから選択された人物の折れ線グラフが、「線の太さ」に指定した値に変わる。特定の人物の折れ線グラフだけ目立たせるのに役に立つのではないかと思う。

ExcelVBATipsGraph9_03.png 図5 コンボボックスから選択した人物の折れ線グラフの太さが変わった

折れ線グラフを滑らかにするSmoothプロパティ

 最後に、「折れ線グラフを滑らかにする」方法について解説する。新しいシートを追加し、図2をそのままコピーしておこう。書式は下記の通りだ。

折れ線グラフを滑らかにするSmoothプロパティの書式

ActiveSheet.ChartObjects(1).Chart.SeriesCollection.Item({インデックス番号}).Smooth = True


 Chart.SeriesCollection.Item({インデックス番号})については、これまでと同様なので省略する。Smoothプロパティに「True」を指定すると、指定した人物の折れ線グラフにスムージング適用される。

 この書式を基にマクロを記述してみよう。Module1にリスト3のコードを記述する。

Option Explicit
Sub スムージング表示()
  Dim i As Integer
  Dim 人物インデックス As Integer
  人物インデックス = Range("U2").Value - 1
  For i = 1 To 4
    ActiveSheet.ChartObjects(1).Chart.SeriesCollection.Item(i).Smooth = False
  Next
On Error GoTo myError
  ActiveSheet.ChartObjects(1).Chart.SeriesCollection.Item(人物インデックス).Smooth = True
 
myError:
  Exit Sub
End Sub
リスト3 折れ線グラフにスムージングを設定するコード

 2〜6行目については、リスト1と同様のため、省略する。

 繰り返しの過程の7行目で、折れ線グラフのSmoothプロパティに「False」を指定して、全ての折れ線グラフのスムージングを消去している。この処理を書いていないと、「氏名」を選択するたびに、折れ線グラフにスムージングが適用され、最終的には全ての折れ線グラフに、スムージング処理が掛かってしまい、選択した氏名のグラフにだけスムージングが掛からなくなる。

 その上で、10行目で特定のデータのグラフだけに「Smooth = True」でスムージングを設定している。

 コンボボックスを選択して、マウスの右クリックで表示されるメニューから、「マクロの登録」を選択し、リスト3のマクロと関連付ける。

 実行すると、図6のようにコンボボックスから選択された人物の折れ線グラフにスムージングが適用されて表示される。

ExcelVBATipsGraph10_02.png 図6 コンボボックスから選択した人物の折れ線グラフにスムージングが掛かった

次回からは、Excel VBAのフォームに関するTips

 今回は折れ線グラフに関するTipsを紹介したが、いかがだっただろうか。

 今回のTipsはどれも、Excelを用いて成績を付ける際に、任意の人物の得点を目立たせて表示させるなどの用途に役に立つTipsだと思う。特定の人物のデータだけ目立たせて表示したい場合は、今回の例のような学校だけではなく企業の実務の現場でもあるはずだ。このTipsをアレンジして、ぜひ現場で使ってもらいたい。

 次回からは、Excel VBAのフォームに関するTipsを紹介していくので、お楽しみに。

著者プロフィール

kuniyasu.jpg

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

薬師寺国安事務所代表。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© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

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

メールマガジン登録

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