【VBA】ボタン一つで散布図の系列色を変更する

目次

概要

本記事では、ワークシート上のボタンを一つクリックするだけで、散布図の特定系列の線色を変更する方法をご説明いたします。系列の種類やマーカー設定には一切触れず、凡例の並びを変えないことを重視した構成です。

前提条件

  • Microsoft 365 版 Excel を使用していること。
  • 対象のグラフは散布図であること。
  • 変更対象の系列名をセル AB17 に記入しておくこと。
  • ボタンは一つのみ配置し、後述のマクロを割り当てること。

手順

  1. 開発タブから「挿入」より図形を一つ配置し、右クリックの「マクロの登録」で後述の Change_the_ColorLine_AB17 を割り当てます。
  2. セル AB17 に、色を変更したい系列名を正確に入力します。
  3. ボタンをクリックし、表示される色選択ダイアログから任意の色を選択します。
  4. アクティブシート上の全ての埋め込み散布図に対し、AB17 と完全一致する系列名を持つ系列の線色のみが変更されます。

コード全文

以下のコードを標準モジュールに貼り付けてご利用ください。

Option Explicit

'==============================
' 色選択ダイアログ(32/64bit 対応)
'==============================
#If VBA7 Then
    Private Type CHOOSECOLOR
        lStructSize     As Long
        hwndOwner       As LongPtr
        hInstance       As LongPtr
        rgbResult       As Long
        lpCustColors    As LongPtr
        Flags           As Long
        lCustData       As LongPtr
        lpfnHook        As LongPtr
        lpTemplateName  As LongPtr
    End Type

    Private Declare PtrSafe Function ChooseColor Lib "comdlg32.dll" Alias "ChooseColorA" ( _
        ByRef pChoosecolor As CHOOSECOLOR) As Long
#Else
    Private Type CHOOSECOLOR
        lStructSize     As Long
        hwndOwner       As Long
        hInstance       As Long
        rgbResult       As Long
        lpCustColors    As Long
        Flags           As Long
        lCustData       As Long
        lpfnHook        As Long
        lpTemplateName  As String
    End Type

    Private Declare Function ChooseColor Lib "comdlg32.dll" Alias "ChooseColorA" ( _
        ByRef pChoosecolor As CHOOSECOLOR) As Long
#End If

Private Const CC_RGBINIT  As Long = &H1&
Private Const CC_FULLOPEN As Long = &H2&

Private Function ShowColorDialog(Optional ByVal DefaultColor As Long = 0) As Long
    Dim cc As CHOOSECOLOR
#If VBA7 Then
    Dim aCust(0 To 15) As Long
#Else
    Dim CustColors As String
#End If

    With cc
        .lStructSize = Len(cc)
        .hwndOwner = Application.Hwnd
        .Flags = CC_RGBINIT Or CC_FULLOPEN
        .rgbResult = DefaultColor
#If VBA7 Then
        .lpCustColors = VarPtr(aCust(0))
#Else
        CustColors = String$(16 * 4, vbNullChar)
        .lpCustColors = CustColors
#End If
    End With

    If ChooseColor(cc) <> 0 Then
        ShowColorDialog = cc.rgbResult
    Else
        ShowColorDialog = -1
    End If
End Function

'==============================
' 中核:色だけを変更(凡例順は不変)
' 触るのは Line.ForeColor.RGB のみ
'==============================
Private Sub ChangeColor_ScatterOnly_ColorOnly(ByVal cellAddress As String)
    Dim ws As Worksheet
    Dim targetName As String
    Dim chosen As Long
    Dim co As ChartObject
    Dim sc As SeriesCollection
    Dim s As Series
    Dim i As Long
    Dim ct As XlChartType

    Set ws = ActiveSheet
    targetName = CStr(ws.Range(cellAddress).Value)

    chosen = ShowColorDialog
    If chosen = -1 Then Exit Sub

    For Each co In ws.ChartObjects
        ct = co.Chart.ChartType
        Select Case ct
            Case xlXYScatter, xlXYScatterLines, xlXYScatterLinesNoMarkers, _
                 xlXYScatterSmooth, xlXYScatterSmoothNoMarkers

                On Error Resume Next
                Set sc = co.Chart.SeriesCollection
                On Error GoTo 0
                If sc Is Nothing Then GoTo NextChart

                For i = 1 To sc.Count
                    Set s = sc.Item(i)
                    ' 完全一致のみ
                    If StrComp(CStr(s.Name), targetName, vbBinaryCompare) = 0 Then
                        ' 線色のみ変更(系列タイプ・マーカー・PlotOrder には一切触れない)
                        On Error Resume Next
                        s.Format.Line.ForeColor.RGB = chosen
                        On Error GoTo 0
                    End If
                Next i
        End Select
NextChart:
    Next co
End Sub

'==============================
' ラッパー:AB17 を対象(ボタンは一つ)
'==============================
Public Sub Change_the_ColorLine_AB17()
    ChangeColor_ScatterOnly_ColorOnly "AB17"
End Sub

実装上の注意点

  • 系列名の比較は完全一致で行っております。セルの前後に空白が含まれていないかご確認ください。
  • 凡例の並びやマーカー表示を変えないため、系列の種類やマーカー関連のプロパティには一切触れておりません。
  • アクティブシート上のすべての埋め込みグラフが対象となります。特定のグラフに限定したい場合は、ChartObject 名での条件分岐を追加してください。

まとめ

本稿では、ボタン一つで散布図の特定系列の線色のみを変更する方法をご紹介いたしました。凡例の順序やマーカーの有無を変化させない実装として、運用時の見た目の一貫性を保てます。必要に応じて参照セルや対象グラフの条件を調整し、用途に合わせてご活用ください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次