こんにちは、Ryoです。
VBAを使用してグラフを作成する中で、円グラフを扱う場合に一部を切り離して強調表示することで視覚的に表現することができます。今回はその処理を行う上での「要素、要素数の取得」「要素の切り出し/解除」「データラベルの表示/非表示」について書いていきたいと思います。
1.サンプル概要
簡易的な円グラフをサンプルとして準備し、その円グラフの一部を切り出します。その際に切り出した要素にはデータラベルを表示させますが、データを元に戻す際にラベルも非表示にしています。

一連の動作概要としては以下の通りです。
グラフ一部を切り離すコードは「切り離し」ボタンに割り付けてありますので、ボタンクリックでインプットボックスを表示させます。

表示させる時点でグラフ要素数を取得しているので、その最大値までの範囲内で入力を促します。サンプルのグラフは要素数が3つなので1~3の範囲になりますが、入力の際に0や範囲外(4以上)の数値入力時は警告表示した後に再入力としています。

切り離したい要素部分を指定すると、対象部位を切り出してデータラベル(値)を表示させます。

全ての要素を切り離して表示させた場合はこのような形になります。

グラフの切り出しやデータラベル表示をリセットするコードは「元に戻す」ボタンに割り付けてあるので、そのボタンを押すことで初期状態に戻ります。

以上がサンプル概要になります。
2.サンプルコード
◆グラフ切り出し処理
'同モジュールの全プロシージャ共通変数として設定
'変数b⇒要素指定番号(インプットボックス受取)
Private b As Variant
Sub Sample1()
Dim a As Variant
'今回の対象グラフは円グラフなので系列は「1つ」
With ActiveSheet.ChartObjects(1).Chart.SeriesCollection(1)
'指定した系列に対し.XValuesプロパティを利用することで
'グラフ系列のx値の配列を取得し、その配列数を要素数とする
a = UBound(.XValues)
rtn:
'InputBoxメソッドを使用し円グラフの切り離したい部分を
'要素番号で入力を促して取得する
b = Application.InputBox("切り離したい要素 1~" & a & _
" の中で指定してください", Type:=1)
'キャンセルボタンが押された場合はBoolean型が返されるので、
'VarType関数で判定する
If VarType(b) = vbBoolean Then Exit Sub
'入力値が取得した要素数最大値を超える場合、または0の場合
'警告メッセージ表示後に再入力を促す
If b > a Or b = 0 Then
MsgBox "入力値が不正です", vbCritical
GoTo rtn
End If
'指定した要素部分のグラフに対し、データラベル(値)を
'表示させるSampe3()を呼び出して実行する
Call Sample2
'円グラフの指定要素部分を切り離す
'指定数値はグラフの半径に対するパーセンテージ
.Points(b).Explosion = 15
End With
End Sub
このサンプルコードでは指定グラフの要素数を取得してインプットボックスに表示し、受け付けた入力値やキャンセルに対して処理を実行します。データラベルの表示は別プロシージャを呼び出して実行(Sample2)します。
今回のサンプルは円グラフなので系列は「1つ」になりますから、SeriesCollectionメソッドのIndex番号に「1」を指定しています。
構文:オブジェクト.SeriesCollection(index)
SeriesCollectionメソッドはグラフのデータ系列を返すもので、引数indexを指定した場合にindex番号のデータ系列を返します。
その系列に対し、先ずは要素数を取得しますのでXValuesプロパティを利用してグラフ系列の x値の配列を取得します。
構文:Seriesオブジェクト.XValues
ここでのSeriesオブジェクトは「ActiveSheet.ChartObjects(1).Chart.SeriesCollection(1)」ですから、ここにXValuesプロパティを使用すると以下のように配列として取得できます。

後は a = UBound(.XValues) のようにUBound関数で配列数を取得することで要素数としています。
取得した要素数は次に表示させるInputBoxの範囲最大値表示、及び入力値の正誤判定に使用します。その他にInputBoxからのキャンセル処理や入力値不正に対する警告処理などを行い、指定要素のデータラベル表示処理を経てグラフの切り離し処理を実行しています。
ここで実行している円グラフやドーナツグラフの要素を切り出すにはExplosionプロパティを利用します。
構文:オブジェクト.Explosion = expression(0~1000)
Explosionプロパティは指定された円グラフ/ドーナツグラフの要素を切り出します。指定値としては0~1000の範囲の値が有効ですが、この値は切り出し値で「グラフ半径に対するパーセンテージ」になっています。
サンプルでは.Explosion = 15としていますので15%ということになります。
◆指定要素へのデータラベル表示
Sub Sample2()
'***指定要素部分へのデータラベル表示***
'円グラフの指定要素に対する処理
With ActiveSheet.ChartObjects(1).Chart.SeriesCollection(1).Points(b)
'データラベルの表示(単体要素なので HasDataLabel と記述)
.HasDataLabel = True
'データラベルに値を表示
.ApplyDataLabels ShowValue:=True
'フォントサイズ指定
.DataLabel.Font.Size = 14
'フォントカラー指定(白)
.DataLabel.Font.Color = RGB(255, 255, 255)
End With
End Sub
指定要素はInputBoxで受け取って変数bに代入されていますので、変数bはプライベートモジュールレベル変数として同一モジュールの全プロシージャ共通として設定しています。
その指定要素に対しデータラベルの表示/非表示を設定するにはHasDataLabelsプロパティを使用します。
構文:オブジェクト.HasDataLabels = expression(True/False)
HasDataLabelsプロパティはデータ系列のデータラベルの表示(True)、非表示(False)を設定するものです。今回のサンプルの場合、指定要素に対するデータラベル表示としているのでオブジェクトにPoints(b)と単体指定するような際は複数形ではなく「.HasDataLabel =True」と記述しなければエラーになります。
また、データラベルに表示する値の設定はApplyDataLabelsメソッドを利用します。指定する値については以下の通りなのでご参考までに。
≪ApplyDataLabelsメソッドの引数≫
| 引数 | 内容 |
| Type | データラベルの種類をXlDataLabelsTypeクラスの定数で指定 |
| LegendKey | True指定:要素に隣接して凡例マーカー |
| AutoText | True指定:オブジェクトにより内容を基にした適切な文字列を自動作成 |
| HasLeaderLines | True指定:データ系列に引き出し線が追加 |
| ShowSeriesName | True指定:データラベルに系列名を表示 |
| ShowCategoryName | True指定:データラベルに分類名を表示 |
| ShowValue | True指定:データラベルに値を表示 |
| ShowPercentage | True指定:データラベルにパーセンテージを表示 |
| ShowBubbleSize | True指定:データラベルにバブルサイズを表示 |
| Separator | データラベルの区切り文字を指定 |
≪ApplyDataLabelsメソッドの引数Typeに指定するXlDataLabelsTypeクラスの定数≫
| 定数 | 内容 |
| XlDataLabelsShowBubbleSizes | 絶対値に対するバブルのサイズ |
| XlDataLabelsShowLabel | データ要素の属する分類名 |
| XlDataLabelShowLabelAndPercent | 全体のパーセンテージ、要素の項目名(円グラフ/ドーナツグラフのみ) |
| XlDataLabelsShowNone | なし |
| XlDataLabelsShowPercent | 全体のパーセンテージ(円グラフ/ドーナツグラフのみ) |
| XlDataLabelsShowValue | データ要素の属する既定値 |
| ShowValue | True指定:データラベルに値を表示 |
| ShowPercentage | True指定:データラベルにパーセンテージ表示 |
| ShowBubbleSize | True指定:データラベルにバブルサイズ表示 |
| Separator | データラベルの区切り文字を指定 |
サンプルではデータラベルに値を表示したいので、.ApplyDataLabels ShowValue:=Trueとしています。
後は視認性を向上させるための処理としてフォントサイズやフォントカラーを設定して処理を終了させています。
◆グラフ初期状態への復旧
Sub Sample3()
'***グラフ初期状態への復旧***
'円グラフ系列1(全体)に対する処理
With ActiveSheet.ChartObjects(1).Chart.SeriesCollection(1)
'データラベルの削除(非表示化)
.HasDataLabels = False
'切り出したデータを元に戻す(0を指定)
.Explosion = 0
End With
End Sub
ここでは表示したデータラベルの非表示化と切り出したグラフを元の位置に戻す処理を行います。
データラベルの非表示化はHasDataLabelsプロパティにFalseを設定することで対処できます。この処理で非表示化する要素は複数のケースもあるので系列1(.SeriesCollection(1))に対し「.HasDataLabels =False」として全体を対象とするように記述しています。
後は切り出したデータを元に戻しますが、その処理にはExplosionプロパティに「0」を設定することで対応できます。
3.まとめ
集計したデータをグラフ化し、その中で強調表示したい要素を切り離して表示することで視認性を向上させることもできますから、手段を知っておくと有用です。
グラフの要素については取得する方法にやや癖がありますが、わかってしまえばそれほど難しいこともありませんので、要素を個別に指定して対処できれば活用の幅も広がるのではないかと思います。
以上、円グラフの切り離し/データラベルを表示する方法についてでした!今回の記事が何かの参考になれば幸いです。
Ryo

