売上推移や在庫の増減など、数値の並びだけではパッと傾向がつかみにくいデータも、セルの中に小さなグラフ(スパークライン)を添えるだけで一目で分かるようになります。Excelの「挿入」タブから手動で設定することもできますが、行数が多いデータでは1行ずつ設定するのは手間がかかります。
この記事では、VBAのSparklineGroupsを使ってスパークラインを自動作成する方法を、基本の作成から書式設定、複数行への一括適用、削除まで解説します。
スパークラインとは
スパークラインは、セル内に表示できる小さなグラフです。折れ線・縦棒・勝敗(増減)の3種類があり、セルの値を変えずに傾向だけを視覚的に表示できるのが特徴です。表のレイアウトを崩さずに推移を見せたいときに便利な機能です。
基本の使い方:1つのスパークラインを作成する
スパークラインは、RangeオブジェクトのSparklineGroups.Addメソッドで作成します。作成先(表示するセル)に対してAddを呼び出し、種類とデータ範囲(文字列アドレス)を指定します。
Sub AddSingleSparkline()
Dim sg As SparklineGroup
' F2セルに、B2:E2のデータを元にした折れ線スパークラインを作成
Set sg = Range("F2").SparklineGroups.Add(xlSparkLine, "B2:E2")
MsgBox "スパークラインを作成しました"
End Sub
xlSparkLineを指定すると折れ線、xlSparkColumnを指定すると縦棒タイプのスパークラインになります。
複数行に一括で作成する
表のデータが複数行にわたる場合でも、作成先とデータ範囲をそれぞれ複数行にまとめて指定すれば、行ごとに対応したスパークラインをまとめて作成できます。1件ずつループする必要はありません。
Sub AddSparklinesForAllRows()
Dim sg As SparklineGroup
Dim lastRow As Long
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
lastRow = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row
' B2:E(lastRow) のデータを元に、F2:F(lastRow) にまとめてスパークラインを作成
Set sg = ws.Range("F2:F" & lastRow).SparklineGroups.Add( _
xlSparkLine, "B2:E" & lastRow)
MsgBox lastRow - 1 & "行分のスパークラインを作成しました"
End Sub
この方法で作成したスパークラインは「グループ」として扱われ、後から色や太さを変更すると同じグループ内のすべてのスパークラインに一括で反映されます。
書式を設定する(色・線の太さ・強調表示)
作成したスパークライングループに対して、色や特定のポイント(最大値・最小値・マイナス値)の強調表示を設定できます。
Sub FormatSparklines()
Dim sg As SparklineGroup
Set sg = Range("F2").SparklineGroups.Item(1)
' 線の色と太さ
sg.SeriesColor.Color = RGB(68, 114, 196)
sg.LineWeight = 1.5
' 最高値・最安値・マイナス値を強調表示
sg.Points.High.Visible = True
sg.Points.High.Color.Color = RGB(0, 176, 80)
sg.Points.Low.Visible = True
sg.Points.Low.Color.Color = RGB(255, 0, 0)
sg.Points.Negative.Visible = True
sg.Points.Negative.Color.Color = RGB(255, 0, 0)
End Sub
Points.HighやPoints.Lowは、グループ内で最も高い値・低い値を持つ点を自動的に見つけて色付けしてくれるため、手作業で条件付き書式を組むよりも簡単に「一番良い月」「一番悪い月」を目立たせることができます。
グラフの種類を後から変更する
作成済みのスパークライングループのTypeプロパティに別の種類を代入すると、折れ線と縦棒を切り替えられます。
Sub ChangeSparklineType()
Dim sg As SparklineGroup
Set sg = Range("F2").SparklineGroups.Item(1)
' 折れ線から縦棒に変更
sg.Type = xlSparkColumn
End Sub
スパークラインを削除する
不要になったスパークラインは、対象セルのSparklineGroupsコレクションに対してDeleteを呼び出すことで削除できます。
Sub DeleteSparklines()
Dim lastRow As Long
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
lastRow = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row
ws.Range("F2:F" & lastRow).SparklineGroups.Delete
MsgBox "スパークラインを削除しました"
End Sub
実践例:売上表にまとめてスパークラインを設定するマクロ
ここまでの内容を組み合わせると、月次売上表の各行に、色や強調表示まで整えたスパークラインをワンクリックで一括設定できます。
Sub SetupSalesSparklines()
Dim ws As Worksheet
Dim sg As SparklineGroup
Dim lastRow As Long
Set ws = ThisWorkbook.Worksheets("Sheet1")
lastRow = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row
' 既存のスパークラインがあれば一旦削除してから作り直す
On Error Resume Next
ws.Range("F2:F" & lastRow).SparklineGroups.Delete
On Error GoTo 0
Set sg = ws.Range("F2:F" & lastRow).SparklineGroups.Add( _
xlSparkLine, "B2:E" & lastRow)
With sg
.SeriesColor.Color = RGB(68, 114, 196)
.LineWeight = 1.25
.Points.High.Visible = True
.Points.High.Color.Color = RGB(0, 176, 80)
.Points.Low.Visible = True
.Points.Low.Color.Color = RGB(255, 0, 0)
End With
MsgBox "売上表のスパークラインを更新しました"
End Sub
注意点
- データ範囲は文字列アドレスで指定する:
AddメソッドのSourceData引数は、Rangeオブジェクトではなく"B2:E2"のような文字列アドレスで渡します。 - 作成先とデータ範囲の行数を揃える:複数行にまとめて作成する場合、作成先セル範囲の行数とデータ範囲の行数が一致している必要があります。
- Excel 2010以降の機能:スパークラインはExcel 2010から搭載された機能のため、古いバージョンとの互換性が必要なブックでは利用できない点に注意してください。
まとめ
- スパークラインは
Range.SparklineGroups.Add(Type, SourceData)で作成する xlSparkLineで折れ線、xlSparkColumnで縦棒タイプになる- 作成先とデータ範囲を複数行まとめて指定すれば、1行ずつのループなしで一括作成できる
SeriesColorやPoints.High・Points.Low・Points.Negativeで色や強調表示を設定できる- 不要になった場合は
SparklineGroups.Deleteで削除する
大量のデータ行にスパークラインを手作業で設定するのは大変ですが、VBAで自動化すれば、データ更新のたびにワンクリックで見た目の整った推移グラフを反映できます。ぜひ月次レポートなどの作成に活用してみてください。


コメント