Excel&VBA解説サイト「エクセルの神髄」様出題の問題集、
「VBA100本ノック」に対する私の回答と解説のページです。
100本ノックの出題リストはこちらから
excel-ubara.com
出題:グラフの色設定
#VBA100本ノック 37本目
棒グラフの最大値と最小値を目立たせたい。
最大値を緑、最小値を赤、データラベルも追加。
データはB2開始で増減に対応し、再実行を考慮してください。
※グラフは棒グラフ作成済です。既定色は随意。
※出来上がりは画像を参照
※シートは任意、グラフはシートに1つだけ

◇ 出題ページはこちら
ソースコード
メインモジュール
Option Explicit ' 着色RGB値 Enum Colorグラフ 既定 = 12611584 最大値 = 5287936 最小値 = 255 End Enum ' 100本ノック037:グラフの色設定 Sub グラフの最大要素と最小要素をハイライトする() ' 着色対象のデータ値を取得 Dim 最大値 As Double: 最大値 = Fx.Max(WSグラフ.Columns(2)) Dim 最小値 As Double: 最小値 = Fx.Min(WSグラフ.Columns(2)) Dim 対象系列 As Series Set 対象系列 = WSグラフ.ChartObjects(1).Chart.SeriesCollection(1) ' 系列の初期化(規定色かつデータラベル非表示) 対象系列.Format.Fill.ForeColor.RGB = Colorグラフ.既定 対象系列.ApplyDataLabels xlDataLabelsShowNone ' すべての項目をループ Dim 項目No As Long For 項目No = 1 To 対象系列.Points.Count With 対象系列.Points(項目No) ' 最大値/最小値の際にグラフ色とデータラベルを設定 Select Case 対象系列.Values(項目No) Case 最大値 .Format.Fill.ForeColor.RGB = Colorグラフ.最大値 .ApplyDataLabels Case 最小値 .Format.Fill.ForeColor.RGB = Colorグラフ.最小値 .ApplyDataLabels End Select End With Next End Sub
汎用関数モジュール
' WorksheetFunctionの短縮取得 ' 参考:https://www.limecode.jp/entry/utility/shortcall-worksheetfunction Function Fx() As WorksheetFunction Set Fx = WorksheetFunction End Function
解説
グラフの内部を細かく書式設定する問題でした。
一応模範解答を作っているつもりなので、
Dim 対象系列 As Series Set 対象系列 = WSグラフ.ChartObjects(1).Chart.SeriesCollection(1)
このようにデータ型を明示した変数を作ってみました。
実際にマクロを作る際はマクロ記録をそのまま書き替えて、
With WSグラフ.ChartObjects(1).Chart.SeriesCollection(1)
このようにWithステートメントを使用して問題ありません。
型が良くわからないオブジェクトもWithを使えば変数のように扱えますので、
特にグラフやシェイプ等、複雑なオブジェクトで活用していきましょう。
他小ワザですが、
' 着色RGB値 Enum Colorグラフ 既定 = 12611584 最大値 = 5287936 最小値 = 255 End Enum
このようにRGB値を列挙型定数として持っておくと、
入力しやすく、変更時にも書き替えが簡単でおすすめです。
着色系のマクロを作る際はこの手法を覚えておいてください。