こんにちは、Ryoです。
グラフ上の系列や要素に対しマーカーの色や形、サイズ変更などもVBAで行うことができます。今回はその内容と処理の際に有用と思われる系列数カウントやインデックス番号取得、系列名の取得などについて合わせて書いていこうと思います。
1.サンプル概要
例として簡易的な折れ線グラフを準備しています。
この折れ線グラフに対して系列名などを取得し、ユーザーフォーム上でマーカースタイルを選択して実行することでデータマーカーの表示や削除を行うサンプルを製作しており、一連の動作としては以下の通りです。
今回ユーザーフォームを利用していますので、取得したグラフ系列から指定した系列に対しデータマーカースタイルもコンボボックスの中から選択することで任意のスタイルに設定できます。
ユーザーフォームの起動時に初期化処理としてグラフの系列数と系列名を取得してコンボボックス1に設定、データマーカースタイルをコンボボックス2に設定しています。(フォーム上のラベルは「要素」となっていますが、折れ線グラフでは「系列」なので、系列として見てもらえればと思います)
コンボボックスの既定値として各コンボボックスに登録された1番目の値を表示するように設定していますので、「A001」「円形」と表示されています。
この状態で「OK」をクリックすると円形のデータマーカーがA001系列に設定されます。マーカーの前景色や背景色、サイズはコード内で設定しています。
他系列に対しても同様に設定できます。以下の図は「系列B001に四角形」、「系列C001に三角形」をそれぞれ設定したものです。
設定したマーカーを削除(非表示)とするには、フォーム上のコンボボックス2で「なし」を選択して個別に処理するか、フォーム上の「All Clear」ボタンをクリックすることでまとめて非表示とすることができます。
以上がサンプル概要になります。データマーカーの設定自体は特定の系列をコード内で指定すれば良いので必ずしもユーザーフォームが必要ではないのですが、個人的にはグラフ内の系列数や系列名などの取得方法や利用手段を知っておくことがVBAでグラフを扱う上で有用だと思います。
2.サンプルコード
◆UserForm構成
◆UserForm初期化処理
'同モジュール内で共有する変数として 'a,cを設定し、系列数と系列名を格納 Private a, c As Variant Private Sub UserForm_Initialize() '***ユーザーフォーム初期処理*** ' 折れ線グラフの系列数/系列名を取得、 ' データマーカー書式をそれぞれの ' コンボボックスに登録する処理を行う '****************** Dim b, b_Arr As Variant Dim i As Long '系列数カウント、及び系列名の取得と格納 With ActiveSheet.ChartObjects(1).Chart '系列数の取得 a = .SeriesCollection.Count '系列数に応じて配列数を設定 ReDim c(1 To a) As Variant '系列名を取得しコンボボックス1に設定 For i = 1 To a c(i) = .SeriesCollection(i).Name ComboBox1.AddItem c(i) Next i 'コンボボックス1に1番目の値を既定値設定 ComboBox1.ListIndex = 0 End With 'コンボボックス2に登録するデータマーカー書式を配列に設定 b_Arr = Array("円形", "長い棒", "ひし形", "短い棒", _ "なし", "(+)記号", "四角形", "(*)付き四角形", _ "三角形", "X記号付き四角形") With ComboBox2 '配列内のデータをコンボボックス2に追加 For Each b In b_Arr .AddItem b Next 'コンボボックス表示数設定 .ListRows = 5 'コンボボックス2に1番目の値を既定値設定 .ListIndex = 0 End With End Sub
ここではユーザーフォームが表示された時点で完了している処理(初期化処理)を実行しています。内容としては系列数と系列名の取得を行い、データマーカーの書式を合わせてそれぞれのコンボボックスに登録しています。
先ずは現在アクティブ状態のワークシートにある1番目のグラフに対し「系列数」を取得しています。このサンプルでの取得値は「3」になります。
a = ActiveSheet.ChartObjects(1).Chart.SeriesCollection.Count
その系列数に応じて配列宣言を行い、その配列「c」に「系列名」を格納し、コンボボックス1に登録します。ここで登録されるのは「A001」「B001」「C001」の3つになります。
ReDim c(1 To a) As Variant
For i = 1 To a
c(i) = ActiveSheet.ChartObjects(1).Chart.SeriesCollection(i).Name
ComboBox1.AddItem c(i)
Next i
登録後、コンボボックスの既定値として1番目の値(0)を設定します。
ComboBox1.ListIndex = 0
コンボボックス2については、設定するデータマーカーのスタイルを選択できるように項目を登録するので配列として設定し、その内容をコンボボックス2へ登録します。
コンボボックス2の登録数がやや多いので、表示させた際にボタンに被らないよう、表示数を「5」と設定しています。
ComboBox2.ListRows = 5
このような処理にしておくと、対象グラフの系列数が増減した場合でも柔軟に対応することができます。
◆CommandButton1:データマーカー設定
Private Sub CommandButton1_Click() '***グラフのデータマーカー設定*** ' 折れ線グラフの指定系列に対し、 ' データマーカー書式/色/形/ ' サイズなどを設定する処理を行う '******************* Dim sName, dName, nm As Variant 'コンボボックス1で選択されている値を取得 sName = Me.ComboBox1.Value 'Match関数で配列c内の相対的な位置を取得 '(相対的な位置=SeriesCollectionのインデックス番号) nm = WorksheetFunction.Match(sName, c, 0) 'コンボボックス2で選択されている値を取得 dName = Me.ComboBox2.Value 'グラフの指定系列に対する処理 With ActiveSheet.ChartObjects(1).Chart.SeriesCollection(nm) 'マーカーサイズを8ポイントに設定 .MarkerSize = 8 '前景色を「赤」に設定 .MarkerForegroundColor = RGB(255, 0, 0) '背景色を「黄色」に設定 .MarkerBackgroundColor = RGB(255, 255, 0) 'コンボボックス2の値からマーカースタイルを選択 Select Case dName Case "円形" .MarkerStyle = xlMarkerStyleCircle Case "長い棒" .MarkerStyle = xlMarkerStyleDash Case "ひし形" .MarkerStyle = xlMarkerStyleDiamond Case "短い棒" .MarkerStyle = xlMarkerStyleDot Case "なし" .MarkerStyle = xlMarkerStyleNone Case "(+)記号" .MarkerStyle = xlMarkerStylePlus Case "四角形" .MarkerStyle = xlMarkerStyleSquare Case "(*)付き四角形" .MarkerStyle = xlMarkerStyleStar Case "三角形" .MarkerStyle = xlMarkerStyleTriangle Case "X記号付き四角形" .MarkerStyle = xlMarkerStyleX End Select '注記)MarkStyleプロパティには「xlMarkerStyleAutomatic」=自動、 ' 「xlMarkerStylePicture」=画像という定数もあるが、 ' 本サンプルでは未使用 End With End Sub
ここではコマンドボタン1をクリックした際の処理になります。内容としてはコンボボックス1と2の選択された値を読み、「指定された系列」へ「選択されたデータマーカースタイル」と「色、サイズ」を反映します。
コンボボックス1では系列名が表示されていますが、そこで取得する系列名(文字列データ)ではSeriesCollectionメソッドに変数としてセットできずエラーになります。
その為、Match関数を利用して配列内の相対的な位置を取得しインデックス番号としてSeriesCollectionメソッドにセットしています。
Match(検索値, 検索範囲,照合の型)
照合の型は「1」「0」「-1」がありますが、ここでは完全一致検索になる0とします。
nm = WorksheetFunction.Match(sName, c, 0)
ActiveSheet.ChartObjects(1).Chart.SeriesCollection(nm)
系列を指定する処理が完了後、コンボボックス2の値を受け取りデータマーカーのスタイルなどを設定していきます。
マーカーサイズ設定はMarkerSizeプロパティ、前景色設定はMarkerForegroundColorプロパティ、背景色設定はMarkerBackgroundColorプロパティ、マーカー形状はMarkerStyleプロパティにてそれぞれ行います。
構文:オブジェクト.MarkerSize = size
構文:オブジェクト.MarkerForegroundColor=color
構文:オブジェクト.MarkerBackgroundColor=color
構文:オブジェクト.MarkerStyle = XlMarkerStyle
MarkerStyleプロパティに指定する定数は以下の通りです。
定数 | 内容 |
xlMarkerStyleAutomatic | 自動 |
xlMarkerStyleCircle | 円形 |
xlMarkerStyleDash | 長い棒 |
xlMarkerStyleDiamond | ひし形 |
xlMarkerStyleDot | 短い棒 |
xlMarkerStyleNone | なし |
xlMarkerStylePicture | 画像 |
xlMarkerStylePlus | プラス記号(+)付き四角形 |
xlMarkerStyleSquare | 四角形 |
xlMarkerStyleStar | アスタリスク付き(*)付き四角形 |
xlMarkerStyleTriangle | 三角形 |
xlMarkerStyleX | X記号付き四角形 |
サンプルではマーカーサイズを8ポイント、前景色を「赤」、背景色を「黄色」に設定しています。
マーカースタイルはコンボボックス2から取得した値を元にSelect Case文で対象のスタイルを選択し設定しています。
このサンプルコードを実行することで、指定した系列にデータマーカーが反映されます。
◆CommandButton2 : キャンセル処理
Private Sub CommandButton2_Click() 'ユーザーフォームのキャンセル処理 Unload UserForm1 'フォームを閉じる End Sub
コマンドボタン2はキャンセルとして受け付けるものですので、押された際にUnload UserForm1を実行してフォームを閉じる処理を行います。
◆CommandButton3 : データマーカーの初期化(削除)
Private Sub CommandButton3_Click() 'データマーカーの初期化(削除) Dim i As Long 'グラフの全系列に対しデータマーカースタイルを '「なし」設定にすることで削除する For i = 1 To a ActiveSheet.ChartObjects(1).Chart. _ SeriesCollection(i).MarkerStyle = xlMarkerStyleNone Next i End Sub
設定したデータマーカーを一括して非表示とし、初期状態に戻す処理になります。
実行内容としては全系列に対しMarkerStyleプロパティにxlMarkerStyleNone(なし)を設定することで非表示にしています。
3.まとめ
今回サンプルとして作成したユーザーフォームはグラフに対してデータマーカーを任意に設定するだけなので実用性は無いのですが、VBAで処理する際に扱いたい要素である系列へのアプローチ手段を自分なりにまとめておきたかったこともあり、このような形で書いてみました。
グラフ自体をコントロールできると処理結果に応じてカスタマイズできるので、知っておくと幅が広がるのではないかと思います。
以上、グラフのデータマーカー書式を設定する方法についてでした!今回の記事が何かの参考になれば幸いです。
Ryo