Excelのグラフに近似曲線(トレンドライン)を手動で追加している方は多いのではないでしょうか。データの傾向を確認したり、将来の値を予測したりするのに便利な機能ですが、グラフの数が多いと1つずつ設定するのは手間がかかります。
この記事では、VBAのTrendlines.Addメソッドを使って、近似曲線を自動で追加する方法を解説します。近似曲線の種類の指定方法や、将来予測(Forward)の設定方法、既存の近似曲線を削除する方法まで、実務で使えるコード例とあわせて紹介します。
近似曲線(トレンドライン)とは
近似曲線とは、グラフ上のデータのばらつきから全体の傾向を表す線のことです。売上の推移から将来の売上を予測したり、データが右肩上がりか右肩下がりかを視覚的に判断したりする際によく使われます。
Excelでは「線形近似」「指数近似」「多項式近似」など複数の種類が用意されており、VBAからも同じ種類を指定して追加できます。
Trendlines.Addの基本構文
近似曲線は、グラフの系列(Series)が持つTrendlinesコレクションに対してAddメソッドを実行することで追加します。
Set トレンドライン変数 = グラフ.SeriesCollection(系列番号).Trendlines.Add( _
Type:=近似曲線の種類, _
Order:=次数, _
Period:=移動平均の期間, _
Forward:=将来の予測期間, _
Backward:=過去の遡り期間, _
DisplayEquation:=数式を表示するか, _
DisplayRSquared:=R二乗値を表示するか)
主な引数の説明
- Type:近似曲線の種類を
XlTrendlineTypeの定数で指定します(後述) - Order:多項式近似(
xlPolynomial)を使う場合の次数(2〜6) - Period:移動平均近似(
xlMovingAvg)を使う場合の期間 - Forward:グラフの右側(未来方向)に何区間分延長するか
- Backward:グラフの左側(過去方向)に何区間分延長するか
- DisplayEquation:近似式をグラフ上に表示するかどうか(True/False)
- DisplayRSquared:決定係数(R²)をグラフ上に表示するかどうか(True/False)
実践コード:線形近似曲線を追加する
まずは基本形として、シンプルな線形近似曲線を追加するコードです。あらかじめシート上にグラフ(ChartObject)が1つ作成されている前提で進めます。
Sub AddLinearTrendline()
Dim ws As Worksheet
Dim cht As Chart
Dim tl As Trendline
Set ws = ThisWorkbook.Worksheets("Sheet1")
Set cht = ws.ChartObjects(1).Chart
' 既存の近似曲線があれば先に削除しておく
Dim i As Long
For i = cht.SeriesCollection(1).Trendlines.Count To 1 Step -1
cht.SeriesCollection(1).Trendlines(i).Delete
Next i
' 線形近似曲線を追加し、数式とR二乗値を表示する
Set tl = cht.SeriesCollection(1).Trendlines.Add(Type:=xlLinear)
tl.DisplayEquation = True
tl.DisplayRSquared = True
End Sub
既存の近似曲線が残っていると重複して追加されてしまうため、削除処理をあらかじめ入れておくと安全です。
実践コード:将来の予測期間を指定する
売上推移のグラフなどでは、近似曲線を使って「この先数か月分」を予測したいケースがよくあります。Forward引数に予測したい区間数を指定すると、グラフ上で近似曲線が未来方向に延長されます。
Sub AddTrendlineWithForecast()
Dim cht As Chart
Dim tl As Trendline
Set cht = ThisWorkbook.Worksheets("Sheet1").ChartObjects(1).Chart
Set tl = cht.SeriesCollection(1).Trendlines.Add( _
Type:=xlLinear, _
Forward:=3, _
Backward:=0, _
DisplayEquation:=True, _
DisplayRSquared:=True)
tl.Name = "売上予測線"
End Sub
このコードでは、既存のデータ範囲から3区間分(例:3か月分)だけ未来方向に近似曲線を延長しています。tl.Nameで名前を付けておくと、凡例上でも識別しやすくなります。
なお、Trendlineオブジェクト自体からは具体的な予測値(数値)を直接取得できません。予測値をセルに数値として表示したい場合は、WorksheetFunction.Forecast.LinearやWorksheetFunction.Trendをあわせて使うのがおすすめです。
Sub ShowForecastValue()
Dim ws As Worksheet
Dim knownY As Range
Dim knownX As Range
Dim nextX As Double
Dim forecastValue As Double
Set ws = ThisWorkbook.Worksheets("Sheet1")
Set knownY = ws.Range("B2:B13") ' 実績値(売上など)
Set knownX = ws.Range("A2:A13") ' 期間(月など)
nextX = ws.Range("A13").Value + 1
forecastValue = WorksheetFunction.Forecast_Linear(nextX, knownY, knownX)
ws.Range("B14").Value = forecastValue
End Sub
グラフには近似曲線で「傾向」を見せつつ、セルにはForecast.Linearで具体的な予測値を表示する、という組み合わせが実務では扱いやすいです。
近似曲線の種類(XlTrendlineType)
Type引数に指定できる主な定数は以下のとおりです。データの性質に合わせて使い分けましょう。
| 定数 | 内容 | 主な用途 |
|---|---|---|
| xlLinear | 線形近似 | 一定のペースで増減しているデータ |
| xlExponential | 指数近似 | 増減の割合が加速していくデータ |
| xlLogarithmic | 対数近似 | 急激に変化した後に緩やかになるデータ |
| xlPower | 累乗近似 | 一定の割合で増加し続けるデータ |
| xlPolynomial | 多項式近似 | 増減を繰り返すデータ(Order引数で次数指定) |
| xlMovingAvg | 移動平均近似 | データのばらつきを平滑化したい場合(Period引数で期間指定) |
多項式近似・移動平均近似を使う場合は、次のようにOrderまたはPeriodを追加で指定します。
' 多項式近似(次数3)
Set tl = cht.SeriesCollection(1).Trendlines.Add(Type:=xlPolynomial, Order:=3)
' 移動平均近似(期間4)
Set tl = cht.SeriesCollection(1).Trendlines.Add(Type:=xlMovingAvg, Period:=4)
既存の近似曲線を削除する方法
近似曲線を作り直す場合や、不要になった場合はDeleteメソッドで削除します。複数の近似曲線が存在する可能性があるため、後ろから順にループして削除するのが安全です。
Sub DeleteAllTrendlines()
Dim cht As Chart
Dim srs As Series
Dim i As Long
Set cht = ThisWorkbook.Worksheets("Sheet1").ChartObjects(1).Chart
For Each srs In cht.SeriesCollection
For i = srs.Trendlines.Count To 1 Step -1
srs.Trendlines(i).Delete
Next i
Next srs
End Sub
すべての系列の近似曲線をまとめて削除したい場合は、上記のようにSeriesCollection全体をループさせると漏れがありません。
まとめ
今回は、VBAのTrendlines.Addメソッドを使って近似曲線を自動追加する方法を紹介しました。
Trendlines.AddのType引数で近似曲線の種類を指定できるForward引数で未来方向への予測期間を延長できる- 具体的な予測値をセルに表示したい場合は
WorksheetFunction.Forecast.Linearなどと組み合わせる - 多項式近似・移動平均近似では
Order・Period引数の追加指定が必要 - 作り直す前に既存の近似曲線を削除しておくと重複を防げる
グラフを大量に作成・更新するようなマクロを組んでいる方は、ぜひ近似曲線の自動追加も組み込んでみてください。


コメント