和風スパゲティのレシピ

日本語でコーディングするExcelVBA

37本目:グラフの色設定

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値を列挙型定数として持っておくと、
入力しやすく、変更時にも書き替えが簡単でおすすめです。

着色系のマクロを作る際はこの手法を覚えておいてください。