業務効率化に役立つVBA/マクロのさまざまなTipsをコード例を交えて紹介していきます。今回は、透明度を設定するTransparency、テクスチャを設定するPresetTextured、パターンを指定するPatterned、書式をクリアするClearToMatchStyleなどの使い方を紹介する。
Tips「Excelグラフで特定のデータを目立たせるテクニック」では、特定のデータを指定してそれを目立たせる方法としてデータラベルを表示する方法を紹介したが、今回はその応用編だ。Excelグラフで特定のデータを目立たせるさまざまなテクニックを紹介する。
今回紹介するTipsはグラフのUI(ユーザーインターフェース)に関するもので、グラフ表示において「こうしなければならない」というTipsではない。しかし、グラフに対してこのような処理を実装できるということを知っておくことは必要だと思い紹介する。最近ではUX(ユーザーエクスペリエンス)が話題になり、デザインの美しさや、操作性の良さを求められることも多くある。ExcelのVBAについても、UXの概念を取り入れることでより見栄えが良くなるのではないだろうか。
また、グラフにパターンを適用した後に、適用したパターンをクリアしたい場合のために、「グラフの書式をクリアする」Tipsも併せて紹介する。
グラフの色は、何も指定しないとExcelが自動的に決定して表示される。グラフを指定した色に変更する処理を行うと、自分の気に入った色に指定できる。
ActiveSheet.ChartObjects(1).Chart.SeriesCollection({インデックス番号}).Format.Fill.ForeColor.RGB=RGB({赤の割合},{緑の割合},{青の割合})
Tips「特定のデータのグラフにデータラベルを表示する」同様、特定のデータを指定するのにChart.SeriesCollectionメソッドを使う。{インデックス番号}は、今回は「薬師寺」「夏目」「阪神」「正岡」の4名としているので、1〜4となる。
変更するグラフの色を指定する方法はTips「凡例の背景を塗りつぶす色を指定する」同様、Format.Fill.ForeColor.RGBプロパティを使う。
「グラフを指定した色に変更する」という新しいシートを作成して、Tips「特定のデータのグラフにデータラベルを表示する」の図6をそのまま全部コピーしておく。
Module1内にリスト1のコードを記述する。
Sub グラフを指定した色に変更する() Dim 番号 As Integer Range("B3:F9").Select If ActiveSheet.ChartObjects.Count > 0 Then ActiveSheet.ChartObjects(1).Delete End If On Error GoTo myError 番号 = Range("O3").Value - 1 With Range("H2") ActiveSheet.Shapes.AddChart Left:=.Left, Top:=.Top, Width:=Range("H2:M9").Width, Height:=Range("H2:M9").Height End With ActiveSheet.ChartObjects(1).Chart.SeriesCollection(番号).Format.Fill.ForeColor.RGB = RGB(255, 0, 0) myError: Exit Sub End Sub
まず2行目でInteger型変数「番号」を宣言し、3行目でグラフを作成するための元になるデータ「B3:F9」を選択する。4〜6行目では、セル上にすでにグラフが作成されている場合は、Deleteメソッドで削除して初期化している。
コンボボックスの「氏名を選択」を選択するとエラーが発生するので、8行目以降はエラー処理を行っている。
9行目で変数「番号」にコンボボックスから選択された値を表示するセル「O3」の値を格納する。実際のインデックス番号より「-1」しておく。「-1」しておく理由はTips「特定のデータのグラフにデータラベルを表示する」の解説を参照。
10〜12行目では、セル「H2」を基準に、「H2:M9」の範囲にグラフを作成する。
13行目では、変数「番号」に該当する人物のグラフの色を、赤に変化させる。RGB関数の色の割合については、「RGB関数(Visual Basic)- MSDN」を参照してほしい。色を変えたい場合は、RGB関数の値を変えることで対応できる。
ここの処理では、まず選択された氏名のグラフが赤に変化する。次にコンボボックスから別の名前を選択した場合は、すでに表示されているグラフを削除して新しくグラフを作成し、選択された氏名に該当するグラフの色を変えている。この処理を行わないと、一つのグラフの中で該当する人物のグラフが赤になるため、最終的には全て赤のグラフになり、目的とは異なる結果を招くからだ。
実行すると、図1のようにコンボボックスより選択された人物のグラフが赤に変化する。
次にグラフの透明度を設定する方法について解説する。シートを新たに追加して、図2のような生徒別の各科目の点数のデータを作っておこう。このグラフはExcelメニューの[挿入]→[グラフ]と選択して作成したものだ。
ここに表示されているグラフの透明度を変化させてみよう。グラフの透明度を設定するTransparencyプロパティの書式は下記のようになる
With ActiveSheet.ChartObjects(1).Chart.SeriesCollection({インデックス番号}).Format.Fill
.ForeColor.RGB=RGB({赤の割合},{緑の割合},{青の割合})
.Transparency={透明度}
End With
先ほど同様RGB関数で、色を決め、Transparencyプロパティに{透明度}を指定する。値は「0(不透明)」〜「1(透明)」を指定する。
図2に{透明度}を入力するセルと、Excelメニューの[開発]→[挿入]と選択して「フォームコントロール」の中からコンボボックスを選択して配置しておこう。コンボボックスを選択してマウスの右クリックで表示される[コントロールの書式設定]を選択し、表示される画面の[コントロール]タブ内の[入力範囲]や[リンクするセル]を指定する方法もTips「特定のデータのグラフにデータラベルを表示する」と同じなので、そちらを参照してほしい(図3)。
実際にマクロを記述してみよう。Module1にリスト2のコードを記述する。
Option Explicit Sub グラフの透明度を設定する() Dim 番号 As Integer Range("B3:F9").Select If ActiveSheet.ChartObjects.Count > 0 Then ActiveSheet.ChartObjects(1).Delete End If On Error GoTo myError If Range("P2").Value = "" Then MsgBox "透明度を入力してください。" Exit Sub End If If Range("P2").Value > 1 Then MsgBox "透明度の値は0〜1の間です。" Exit Sub End If 番号 = Range("U2").Value - 1 With Range("H2") ActiveSheet.Shapes.AddChart Left:=.Left, Top:=.Top, Width:=Range("H2:M13").Width, Height:=Range("H2:M13").Height End With With ActiveSheet.ChartObjects(1).Chart.SeriesCollection(番号).Format.Fill .ForeColor.RGB = RGB(255, 0, 0) .Transparency = Range("P2").Value End With myError: Exit Sub End Sub
コードについては大体先ほどと同じだ。29行目で赤に変化させたグラフの透明度を決める。Transparencyプロパティに、セル「P2」に入力した透明度を指定する。11〜19行目で{透明度}の入力値に対してチェックを行っている。
コンボボックスを選択して、マウスの右クリックで表示されるメニューから「マクロの登録」を選択し、リスト2のマクロを関連付け実行すると、図4のようにコンボボックスで選択された人物のグラフが赤に変化し、指定した透明度が適用される。
他のグラフと比較してみると、透明度の設定されたグラフは、背景の「目盛り線」が透けて見えているので判断できる。グラフを赤に指定したのに「ピンク」に見えるのは、透明度が設定されているためである。
グラフにはテクスチャも指摘できる。PresetTexturedメソッドの書式は下記の通りだ。
ActiveSheet.ChartObjects(1).Chart.SeriesCollection({インデックス番号}).Format.Fill.PresetTextured 表1の値
{インデックス番号}は、今回も「薬師寺」「夏目」「阪神」「正岡」の4名としているので、最初からインデックス番号は1〜4となる。PresetTexturedメソッドに指定するテクスチャは表1になる。
名前 | 説明 |
---|---|
msoTextureBlueTissuePaper | 青い画用紙のテクスチャ |
msoTextureBouquet | ブーケのテクスチャ |
msoTextureBrownMarble | 大理石(茶)のテクスチャ |
msoTextureCanvas | キャンバスのテクスチャ |
msoTextureCork | コルクのテクスチャ |
msoTextureDenim | デニムのテクスチャ |
msoTextureFishFossil | 化石のテクスチャ |
msoTextureGranite | みかげ石のテクスチャです |
msoTextureGreenMarble | 大理石(緑)のテクスチャ |
msoTextureMediumWood | 木目のテクスチャ |
msoTextureNewsprint | 新聞紙のテクスチャ |
msoTextureOak | オークのテクスチャ |
msoTexturePaperBag | 紙袋のテクスチャ |
msoTexturePapyrus | パピルスのテクスチャ |
msoTextureParchment | セーム皮のテクスチャ |
msoTexturePinkTissuePaper | ピンクの画用紙のテクスチャ |
msoTexturePurpleMesh | 紫のメッシュのテクスチャ |
msoTextureRecycledPaper | 再生紙のテクスチャ |
msoTextureSand | 砂のテクスチャ |
msoTextureStationery | ひな形のテクスチャ |
msoTextureWalnut | くるみのテクスチャ |
msoTextureWaterDroplets | しずくのテクスチャ |
msoTextureWhiteMarble | 大理石(白)のテクスチャ |
msoTextureWovenMat | 麻のテクスチャ |
参考:MsoPresetTexture 列挙(Office)- MSDN |
「グラフにテクスチャを設定する」という新しいシートを作成して、図2のデータとグラフをそのままコピーしておく。「テクスチャの適用」というボタンを配置しておく。
これまでのように、コンボボックスを配置して「氏名」を選択し、またテクスチャも、コンボボックスに表示させて選択させると、リアルタイムに、指定した人物のグラフのテクスチャを変化させることができるが、これまでの処理と解説が重複するので、今回は、コンボボックスは使用していない。これまでのTipsを参考にすると簡単に実現できるので、読者の皆さんが試してほしい。
今回はボタンクリックで任意の人物のグラフにテクスチャを適用させてみた。
Module1内に、リスト3の「グラフにテクスチャを設定する」コードを記述する。
Sub グラフにテクスチャを設定する() ActiveSheet.ChartObjects(1).Chart.SeriesCollection(3).Format.Fill.PresetTextured msoTextureMediumWood End Sub
SeriesCollectionの引数に「3」を指定し、名前が「阪神」のグラフに、表1から「木目のテクスチャ」である「msoTextureMediumWood」を指定している。
リスト3を「テクスチャの適用」ボタンに関連付け実行すると、図5のように氏名が「阪神」のグラフに、「木目のテクスチャ」が適用された。
Excel VBAには、グラフに適用できる「MsoPatternType」というパターンが用意されている。これを使うとグラフにいろいろなパターンを適用できる。
今回はできるだけグラフを大きくした方が見やすいため、データ件数を3件に絞り、新しいシートを追加して図6のようなグラフを作成しておく。
これは、Tips「Excelグラフにタイトル、凡例、データラベルを表示する」でも解説した「凡例項目の“横”と“縦”を変えるには」のように、凡例を選択してマウスの右クリックで表示される[データの選択]から[行/列の入れ替え]を実行している。
また、Excelメニューの[挿入]→[図形]と選択して「角丸四角形」を選択し、「パターンを適用」というボタンを配置している。
グラフにパターンを指定するPatternedメソッドの書式は下記の通りだ。
With ActiveSheet.ChartObjects(1).Chart.SeriesCollection({インデックス番号}).Format.Fill
.Patterned {表2のパターン}
End With
Patternedメソッドに表2のMsoPatternTypeを指定する。
MsoPatternType | 値 | 説明 |
---|---|---|
msoPattern10Percent | 2 | 前景色 10% |
msoPattern20Percent | 3 | 前景色 20% |
msoPattern25Percent | 4 | 前景色 25% |
msoPattern30Percent | 5 | 前景色 30% |
msoPattern40Percent | 6 | 前景色 40% |
msoPattern50Percent | 7 | 前景色 50% |
msoPattern5Percent | 1 | 前景色 5% |
msoPattern60Percent | 8 | 前景色 60% |
msoPattern70Percent | 9 | 前景色 70% |
msoPattern75Percent | 10 | 前景色 75% |
msoPattern80Percent | 11 | 前景色 80% |
msoPattern90Percent | 12 | 前景色 90% |
msoPatternCross | 51 | クロス |
msoPatternDarkDownwardDiagonal | 15 | 前景色の右下がり対角線(反転) |
msoPatternDarkHorizontal | 13 | 前景色の横線(太) |
msoPatternDarkUpwardDiagonal | 16 | 前景色の右上がり対角線(反転) |
msoPatternDarkVertical | 14 | 前景色の縦線(太) |
msoPatternDashedDownwardDiagonal | 28 | 前景色の右下がり対角線(破線) |
msoPatternDashedHorizontal | 32 | 前景色の横線(破線) |
msoPatternDashedUpwardDiagonal | 27 | 前景色の右上がり対角線(破線) |
msoPatternDashedVertical | 31 | 前景色の縦線(破線) |
msoPatternDiagonalBrick | 40 | 前景色のれんが(斜め) |
msoPatternDiagonalCross | 54 | 斜めクロス |
msoPatternDivot | 46 | 前景色の切り込み |
msoPatternDottedDiamond | 24 | 前景色のひし形(点) |
msoPatternDottedGrid | 45 | 前景色の格子(点) |
msoPatternDownwardDiagonal | 52 | 右下対角線 |
msoPatternHorizontal | 49 | 水平方向 |
msoPatternHorizontalBrick | 35 | 前景色のれんが(横) |
msoPatternLargeCheckerBoard | 36 | 前景色と背景色を交互に使用した市松模様(大) |
msoPatternLargeConfetti | 33 | 前景色の紙吹雪(大) |
msoPatternLargeGrid | 34 | 前景色の市松模様(大) |
msoPatternLightDownwardDiagonal | 21 | 前景色の右下がり対角線 |
msoPatternLightHorizontal | 19 | 前景色の横線 |
msoPatternLightUpwardDiagonal | 22 | 前景色の右上がり対角線 |
msoPatternLightVertical | 20 | 前景色の縦線 |
msoPatternMixed | -2 | サポートされていない |
msoPatternNarrowHorizontal | 30 | 前景色の横線(反転) |
msoPatternNarrowVertical | 29 | 前景色の縦線(反転) |
msoPatternOutlinedDiamond | 41 | 前景色のひし形(枠のみ) |
msoPatternPlaid | 42 | 前景色の幅広の縦線と前景色40%の幅広の横線を組み合わせた編み込み |
msoPatternShingle | 47 | うろこ |
msoPatternSmallCheckerBoard | 17 | 前景色と背景色を交互に使用した市松模様(小) |
msoPatternSmallConfetti | 37 | 前景色の紙ふぶき(小) |
msoPatternSmallGrid | 23 | 前景色の格子(小) |
msoPatternSolidDiamond | 39 | 前景色と背景色を交互に使用したひし形(強調) |
msoPatternSphere | 43 | 前景色と背景色を使用した3-Dの球 |
msoPatternTrellis | 18 | 前景色のざらざら |
msoPatternUpwardDiagonal | 53 | 右上対角線 |
msoPatternVertical | 50 | 垂直方向 |
msoPatternWave | 48 | 前景色の小波 |
msoPatternWeave | 44 | 前景色の網目 |
msoPatternWideDownwardDiagonal | 25 | 前景色の右下がり対角線(太) |
msoPatternWideUpwardDiagonal | 26 | 前景色の右上がり対角線(太) |
msoPatternZigZag | 38 | 大波 |
参考:MsoPatternType Enumeration(Office)- MSDN |
Excelメニューの[開発]→[挿入]から、コンボボックスを配置して、マウスの右クリックで表示される[コントロ―ル]の書式設定で、[入力範囲]に各パターンを入力している「U1:U55」までを指定し、[リンクするセル]にはセル「S5」を指定しておく。
これらを指定すると、Tips「Excelグラフで特定のデータを目立たせるテクニック」の「絶対参照と相対参照について」で解説した、「$」マークの入った「絶対参照」となる。
次に、表2の値を「V1:V55」までのセルに入力しておく。全て設定した画面が図7になる。
では、実際にマクロを記述してみよう。Module1にリスト4のコードを記述する。
Option Explicit Sub グラフにパターンを適用する() Dim パターン As Integer パターン = Cells(Range("S5").Value, 22) With ActiveSheet.ChartObjects(1).Chart.SeriesCollection(2).Format.Fill .Patterned パターン End With End Sub
まず、3行目でInteger型変数「パターン」を宣言している。
次に、4行目で「Cells({行番号},{列番号})」の書式にのっとって、コンボボックスから選択されたインデックス値が表示される「S5」の値を{行番号}に指定し、{列番号}には「V列」である「22列」目を指定している。このCellsの値を変数「パターン」に格納する。ここで重要なのは、選択した「パターン」と値を一致させることだ。
5行目で値の格納された変数「パターン」を、Patternedメソッドに指定する。
コンボボックスを選択して、マウスの右クリックで表示されるメニューから「マクロの登録」を選択し、リスト4のマクロを関連付け実行すると、図8のように「夏目」のグラフにコンボボックスから選択されたパターンが適用される。これで、どのパターンが、どのような模様なのか一目瞭然だ。
最後に、「グラフの書式をクリアする」方法について解説しよう。図8に適用したパターンをクリアして、元の状態に戻す処理になる。図7に「書式のクリア」というボタンを追加している。
ActiveSheet.ChartObjects(1).Chart.ClearToMatchStyle
ClearToMatchStyleメソッドで、グラフに適用していた書式をクリアして、標準書式に戻すことができる。
先ほど追加したModule1内にリスト5のコードを記述する。
Sub グラフの書式をクリア() ActiveSheet.ChartObjects(1).Chart.ClearToMatchStyle End Sub
ここでは、ClearToMatchStyleメソッドで、表示されているグラフの書式を標準の書式に戻している。
リスト5を「書式のクリア」ボタンに関連付け実行すると、図9のように「夏目」のグラフが元の標準のグラフに戻る。
「グラフを指定した色に変更する」Tipsは、個別に凡例で確認しなくても、コンボボックスから選択した人物のグラフが赤で表示され、データの推移が一目瞭然で、大変に有益なTipsではないかと思う。ぜひ、読者の皆さんの職場で利用してみてほしい。
社内でExcelを使ってプレゼンテーションを行う場合にも利用できると思う。次回も特定のデータを目立たせる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)。
Microsoft MVP for Development Platforms-Windows Platform Development (Oct 2014-Sep 2015)。
Copyright © ITmedia, Inc. All Rights Reserved.